問題是,在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