我正在构建一个简单的 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");
}
}
所以,我的问题;这是一个合理的方法吗?这里有什么陷阱吗?
最佳答案
我总是在没有容器管理持久性的情况下部署 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 标记。其余设置是标准 spring(EntityManagerFactory、DataSource 等)。
关于java - 使用本地资源而不是 JTA 数据源的 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14719741/