[英]JTA datasource, glassfish and eclipselink
我正在维护一些旧代码,有些不太聪明的开发人员曾经写过(Me。),当我尝试推送新更新时,突然停止了工作。
基本上我有一个DAO的BUNCH,它用于许多不同的线程中。 所有DAO都扩展了该类:
public class DAO {
/**
* The entitymanager.
*/
private EntityManager entitymanager;
/**
* Gets the entitymanager
*
* @return the manager
*/
public EntityManager getManager() {
entitymanager = FactoryMaker.getFactory().createEntityManager();
entitymanager.getTransaction().begin();
entitymanager.flush();
entitymanager.clear();
return entitymanager;
}
/**
* Commit and clear the manager.
*/
public void Close() {
if (entitymanager.isOpen()) {
if (entitymanager.getTransaction().isActive()) {
entitymanager.getTransaction().commit();
entitymanager.clear();
}
entitymanager.close();
}
}
@Override
protected void finalize() throws Throwable {
super.finalize();
}
}
因此,当使用DAO时,将执行以下代码(例如)
/**
* Gets a profiletype based on the specified name.
*
* @param name the name
* @return the by name
*/
public Profiletype getByName(String name) {
EntityManager manager = getManager();
TypedQuery<Profiletype> query = manager.createQuery("SELECT w FROM Profiletype w WHERE w.name='" + name + "'", Profiletype.class);
Profiletype result = query.getSingleResult();
Close();
return result;
}
这实际上完成了工作。 好吧,这不是很漂亮,但是确实有效。 我正在使用glassfish管理连接,所以我的persistence.xml看起来像:
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="dtv4" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/__default</jta-data-source>
<class>...</class>
<class>...</class>
<properties>
<property name="eclipselink.logging.level" value="INFO"/>
<property name="eclipselink.ddl-generation" value="none"/>
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>
</properties>
</persistence-unit>
</persistence>
实际上,我只是看了正在运行的WAR的内部,它是相同的persistence.xml和DAO类。 但是谷歌快速搜索显示,调用entitymanager.getTransaction().begin();
是非法的(不可能! entitymanager.getTransaction().begin();
使用JTA时。
当然,现在我得到了错误
java.lang.IllegalStateException:
Exception Description: Cannot use an EntityTransaction while using JTA.
现在我的问题是:如何在不重写所有内容的情况下解决此问题? 它在我的清单上,但现在我只想推送更新。 我已经读到可以使用@PersistenceContext等,但是当我的DAO只是一个普通的Java类时,它似乎不起作用。
我希望有个聪明的主意可以帮助我。
最好的祝福。
EclipseLink文档指出,可以将其配置为TargetServer,以用于与主机容器https://www.eclipse.org/eclipselink/api/2.6/org/eclipse/persistence/config/TargetServer.html集成。 尝试将persistence.xml属性放入
<property name="eclipselink.target-server" value="Glassfish"/>
使用此属性,确保动态创建的EntityManager将使用事务类型JTA。 希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.