0

我正在构建一个我想使用 JPA 的简单 Web 应用程序。尽管我希望在 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");
    }
}

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

4

2 回答 2

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 等)。

于 2013-02-06T02:11:23.243 回答
0

这确实不是最好的主意。正如@BalusC 指出的那样,您需要接管自己的所有 TX 管理管道,手动创建、启动和结束所有内容。它有大量的样板代码,会让您发现错误,并且您不会从中受益。

即使您在一个精简的 servlet 容器中也可以使用 JTA,该容器不通过自己添加它来提供它,尽管您应该有一个非常充分的理由想要自己组装堆栈,而不是仅仅抓住像 Glassfish 这样提供它的 AS全部免费给你。

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

于 2013-02-08T05:24:19.113 回答