我正在构建一个简单的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");
}
}
所以,我的问题;这是一种合理的方法 - 这里有任何陷阱吗?
答案 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网络配置文件(与完整平台相比),您仍然可以使用它。