JPA с JOTM: невозможно изменить фабрику диспетчера сущностей после изменения фабрики JNDI
Я пытаюсь интегрировать JOTM с JPA в Tomcat. Я могу интегрировать JOTM с JDBC DataSource в Tomcat. Но когда я перешел на JPA, JTA DataSource не нашел. Я могу искать этот источник данных через контекст.
Я использовал Context.xml в пути к классам:
<Context reloadable="true">
<Resource name="jdbc/DB1" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
factory="org.objectweb.jndi.DataSourceFactory"
username="system" password="admin"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/DB1"/>
<Transaction factory="org.objectweb.jotm.UserTransactionFactory"
jotm.timeout="60"/>
</Context>
Атрибут фабрики создает проблему. После удаления он может найти источник данных. Но этот атрибут необходим для выполнения транзакции.
Ниже мое постоянство.xml
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1">
<persistence-unit name="JOTMTest" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>java:/comp/env/jdbc/DB1</non-jta-data-source>
</persistence-unit>
</persistence>
Ниже мой web.xml:
<web-app>
<display-name>JTAProject</display-name>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/DB1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Мой сервлет, имеющий только две строки ниже:
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("JOTMTest");
EntityManager em = emf.createEntityManager();
}
Работая без JPA и используя JDBC, он работает нормально.
public static DataSource getDataSource1(){
DataSource ds = null;
try {
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/DB1");
} catch (NamingException e) {
e.printStackTrace();
}
return ds;
}
Работает нормально. Даже после внедрения JPA. Но он не может найти источник данных через конфигурацию JPA.
Я ищу JTA с JPA без реализации Spring в Tomcat.