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

标签 java jakarta-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");
    }
}

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

最佳答案

我总是在没有容器管理持久性的情况下部署 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/

相关文章:

JPA - 插入连接表的正确方法(带有额外的列)

java - 避免使用多对多关系 jpa 添加相同的数据

java - 创建自己的POS Tagger

java - 单次迭代 => 从 Java 到 Scala 的多个输出集合

jakarta-ee - Payara-Server - 尝试刷新数据时超出写入超时

java - 对于为现有 Java 企业应用程序项目创建独立客户端感到困惑吗?

java - 将持久化实体更改为同级子类

java - 无法访问/运行项目中放置的可执行 jar

java - 在布局中找不到 MapFragment,返回 null

java - hibernate @CollectionOfElements 和@Parent