JPA使用本地资源而不是JTA数据源

时间:2013-02-06 00:52:13

标签: java java-ee jpa

我正在构建一个简单的Web应用程序,我想使用JPA。虽然我希望在Glassfish上进行部署,但我认为在应用程序中管理实体持久性而不是通过JTA数据源可能是有益的。我承认这可能不是一个非常好主意吗?

前段时间我将以下内容放在一起(可能来自现在丢失的网络参考):

public class PersistenceManager {
    private static final PersistenceManager instance = new PersistenceManager();
    protected EntityManagerFactory emf;

    public static PersistenceManager getInstance() {
        return instance;
    }

    private PersistenceManager() {
    }

    public EntityManagerFactory getEntityManagerFactory() {
        if (emf == null) {
            createEntityManagerFactory();
        }
        return emf;
    }

    public void closeEntityManagerFactory() {
        if (emf != null) {
            emf.close();
            emf = null;
        }
    }

    protected void createEntityManagerFactory() {
        this.emf = Persistence.createEntityManagerFactory("Met");
    }
}

所以,我的问题;这是一种合理的方法 - 这里有任何陷阱吗?

2 个答案:

答案 0 :(得分:1)

我总是在没有容器管理持久性的情况下部署JPA。我甚至将它与Atomikos JTA事务管理器一起使用。最简单的方法是不使用基于JNDI的查找。我建议使用Spring的JPATransactionManager并使用persistence.xml或spring-xml配置所有内容。

Spring-xml中的持久性管理器:

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="defaultDataSource" ref="dataSource" />
    <property name="persistenceXmlLocations">
        <list>
            <value>classpath:META-INF/etf-persistence.xml</value>
        </list>
    </property>
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="pum" />
    <property name="persistenceUnitName" value="my-pu" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.ejb.cfgfile">my-hibernate.cfg.xml</prop>

            <prop key="hibernate.session_factory_name">mySessionFactory</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.archive.autodetection">none</prop>

            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">false</prop>       
    </property>
</bean>

不要在persistence.xml中指定非jta或jta-data-source标记。其余的设置是标准弹簧(EntityManagerFactory,DataSource等)。

答案 1 :(得分:0)

这确实不是最好的主意。正如@BalusC所指出的,您需要接管所有自己的TX管理管道,手动创建并启动和结束所有内容。它有大量的样板代码,可以帮助您解决错误,并且您无法从中受益。

你可以使用JTA,即使你是一个精简的servlet容器而不是通过自己添加它来提供它,尽管你应该有一个非常强大的理由想要自己组装堆栈而不是像Glassfish一样抓取一个AS它免费给你一切。

就此而言,即使您选择Glassfish网络配置文件(与完整平台相比),您仍然可以使用它。