JTA数据源,glassfish和eclipselink

时间:2017-11-01 17:43:30

标签: java jpa glassfish eclipselink jta

我维护了一些旧的代码,一些不那么聪明的开发人员曾写过(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类时,它似乎不起作用。

我希望一些聪明的头脑可以帮助我。

最好的问候。

1 个答案:

答案 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。 希望有帮助。