繁体   English   中英

JTA数据源,glassfish和eclipselink

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM