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

Java 使用本地资源而不是JTA数据源的JPA,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我正在构建一个简单的web应用程序,我想使用JPA。虽然我希望在Glassfish上部署,但我认为在应用程序中管理实体持久性可能比通过JTA数据源更有益。我承认这可能不是一个很好的主意 不久前,我将以下内容放在一起(可能来自一个现已丢失的web参考): 那么我的问题,;这是一种合理的方法吗?这里有什么陷阱吗?我总是在没有容器管理持久性的情况下部署JPA。我甚至用过Atomikos JTA事务管理器。最简单的方法是不使用基于JNDI的查找。我建议使用Spring的JPATransactionMan

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

不久前,我将以下内容放在一起(可能来自一个现已丢失的web参考):


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

我总是在没有容器管理持久性的情况下部署JPA。我甚至用过Atomikos JTA事务管理器。最简单的方法是不使用基于JNDI的查找。我建议使用Spring的JPATransactionManager进行编译,并使用persistence.xml或SpringXML配置所有内容

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>

类路径:META-INF/etf-persistence.xml
my-hibernate.cfg.xml
mySessionFactory
org.hibernate.dialen.oracle10galent
没有一个
假的
假的

不要在persistence.xml中指定非jta或jta数据源标记。其余的设置是标准spring(EntityManagerFactory、DataSource等)。

这确实不是最好的主意。正如@BalusC所指出的,您需要接管您自己的所有TX管理管道,手动创建并开始和结束所有内容。这是一大堆样板代码,让你暴露在bug面前,而你从中得不到任何好处

您可以使用JTA,即使您是在一个精简的servlet容器中,而该容器并没有通过自己添加来提供JTA,尽管您应该有一个非常充分的理由希望自己组装堆栈,而不是像Glassfish一样抓取一个免费提供给您的组件


因此,即使您选择Glassfish web概要文件(相对于完整平台),您仍然可以使用它

我想我在考虑可能在不支持托管持久性的Servlet容器中进行部署。为什么要接管事务管理?你的JPA代码将一塌糊涂。而不仅仅是一个
@PersistenceContext实体管理器em
在EJB中并在其上调用oneliner方法,您必须手动创建实体管理器工厂、手动创建实体管理器、手动启动事务、手动提交事务、手动结束事务、手动关闭实体管理器和手动关闭实体管理器工厂。那么,重申一下Rick,这有什么好处呢?当我带着一个工作示例进入我的计算机时,我将使用示例xml进行更新。如果JavaEE已经提供了EJB和JTA,为什么要使用legacy Spring呢?
<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>