问题是,在Spring托管bean中注入@PersistenceContext
的EntityManager
不会将实体持久存储到数据库。我尝试在AddDao
bean上使用@Transactional
,其中entityManager.persist()
被调用(我启用了注释驱动事务)。LocalContainerEntityManagerFactoryBean的EntityManager不会将实体持久存储到数据库中
事务从Camel Java DSL中的.transacted()
实例化的另一个bean开始。该豆有一个@Autowired
财产,这是DAO和EntityManager
注入@PersistenceContext
。
使用事务管理器Bitronix。
的Spring XML配置文件的一部分是这样的:
<bean id="localContainerEntityManagerFactoryBean" depends-on="btmConfig" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jtaDataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="nameFromPersistenceXml"/>
<property name="persistenceProvider">
<bean class="org.hibernate.ejb.HibernatePersistence"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
<property name="packagesToScan" value="package with @Entity POJOs"/>
</bean>
<bean id="btmConfig" factory-method="getConfiguration"
class="bitronix.tm.TransactionManagerServices">
<property name="serverId" value="spring-btm" />
</bean>
<!-- create BTM transaction manager -->
<bean id="BitronixTransactionManager" factory-method="getTransactionManager"
class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig"
destroy-method="shutdown" />
<!-- Spring JtaTransactionManager -->
<bean id="springTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="BitronixTransactionManager" />
<property name="userTransaction" ref="BitronixTransactionManager" />
</bean>
<tx:annotation-driven transaction-manager="springTransactionManager" />
编辑:在一个过分简化的版本,它看起来是这样的:
在骆驼的Java DSL有
from("wsLayer")
.transacted()
.otherProcessing()
.to("bean:addBean?method=addMyEntity")
加豆看起来像这样:
@Component
public class AddBean {
@Autowired
private AddDao addDao;
public void addMyEntity(MyEntity myEntity) {
//other business logic
addDao.persistMyEntity(myEntity);
}
}
@Component
public class AddDao {
@PersistenceContext
private EntityManager entityManager;
//I have tried here
//@Transactional and
//@Transactional(propagation = PropagationType.REQUIRES_NEW)
public void persistMyEntity(MyEntity myEntity) {
entityManager.persist(myEntity);
}
}
从数据库读取效果很好。
查看资料来源:
<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource"
init-method="init" destroy-method="close">
<property name="uniqueName" value="theName" />
<property name="maxPoolSize" ><value>${db.pool.maxSize}</value></property>
<property name="minPoolSize" ><value>${db.pool.minSize}</value></property>
<property name="allowLocalTransactions" ><value>true</value></property>
<property name="automaticEnlistingEnabled" ><value>true</value></property>
<property name="className" ><value>${db.pool.datasource}</value></property>
<property name="driverProperties" ref="databaseProperties" />
</bean>
,其中属性在Maven的pom.xml
这样设置:
db.pool.maxSize=15
db.pool.maxSize=5
db.pool.datasource=org.postgresql.xa.PGXADataSource
你没有把代码你试图坚持在你的文章中的实体,它可能是一个“大对象”的情况? 选中此链接(http://www.postgresql.org/docs/8.4/interactive/largeobjects.html)。希望能帮助到你。编辑:我发现[这](http://stackoverflow.com/questions/12362531/how-do-you-auto-commit-an-sql-server-transaction-in-jpa)。 – n3k0 2013-05-09 21:16:05
实际上,它不会持续任何域对象,既不是大也不是小对象。它将它们保存到缓存/实体管理器中,但不保存到数据库(这是PostgreSQL btw);在调用'em.persist(entity)'后立即在'em.contains(entity)'之后,结果是真的,但是'entity'实际上并没有持久化到数据库。我猜这与交易有关。关于链接,对象通常被映射,事务在'persistence.xml'中是'JTA',而不是在那里讨论的'RESOURCE_LOCAL'。 – m3th0dman 2013-05-09 21:25:20