我维护了一些旧的代码,一些不那么聪明的开发人员曾写过(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类。但是,快速谷歌搜索显示,使用JTA时调用entitymanager.getTransaction().begin();
是非法的(不可能!)。
当然,现在我收到了错误
java.lang.IllegalStateException:
Exception Description: Cannot use an EntityTransaction while using JTA.
现在我的问题是:如何在不重写所有内容的情况下解决这个问题?它在我的列表中,但是现在我只想推动更新。我已经读过你可以使用@PersistenceContext等,但是当我的DAO只是一个普通的Java类时,它似乎不起作用。
我希望一些聪明的头脑可以帮助我。
最好的问候。
答案 0 :(得分:0)
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。 希望有帮助。