这是一个学术问题; 我没有破坏与此相关的代码.我只是想扩大我对引擎盖下发生的事情的理解.
我在我的JPA DAO中使用的代码模式(从书籍和教程中复制)用于我的典型JSF Web应用程序基本上是这样的:
public class someDAO {
@PersistenceContext protected EntityManager em;
@Resource private UserTransaction utx;
public void persist(Entity entity) {
try {
utx.begin();
em.persist(entity);
utx.commit();
} catch ( // gawd awful long list of possible exceptions )
// etc
Run Code Online (Sandbox Code Playgroud)
所以我的问题如下:
为什么EntityManager实例和UserTransaction实例注入了来自两个看似无关的包的注释?
为什么注释@Resource和@PersistenceContext而不是@ManagedProperty或@Inject使用?
persist()方法如何访问utx对象并与之交互?如果我忘记了utx.begin()调用,实体管理器就会知道它并抛出异常.它必须以某种神奇的方式找到UserTransaction对象.是不是更好的架构来定义接口,如: em.persist(utx,entity)?
如果utx是某种单例 - 是否可以一次打开多个UserTransaction?
非常感谢任何讨论.
我正在使用我的项目<version.org.aspecj>1.7.4</version.org.aspecj>和<vesrion.org.springframework>4.0.1.RELEASE</vesrion.org.springframework>版本.最近我将这两个版本升级到 <version.org.aspectj>1.8.9</version.org.aspectj>和
<version.org.springframework>4.3.11.RELEASE</version.org.springframework>.
我在我的项目中使用JPA存储库,当我尝试保存任何对象时,我收到的错误如"JTA EntityManager无法使用getTransaction()".
下面是我的persistence.xml和其他配置.请求您查看这些配置并分享您的输入.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="appPersistenceUnit"
transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/appDS</jta-data-source>
<!-- entities -->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="jboss.entity.manager.factory.jndi.name"
value="persistence-units/fusePersistenceUnit"/>
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
<property name="hibernate.connection.autocommit" value="false"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.current_session_context_class"
value="jta"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.generate_statistics" value="false"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>
<property name="hibernate.jdbc.batch_size" value="40"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.search.default.directory_provider" value="filesystem" />
<property name="hibernate.connection.url" …Run Code Online (Sandbox Code Playgroud)