我更喜欢使用通过LocalContainerEntityManagerfactorybean获得的JPA Entitymanager工厂进行持久化.
但是,当我想支持spring ldap和JPA之间的事务时,我碰壁了.我的服务层同时调用LDAP dao和JPA dao.
春天的ldap具有ContextSourceAndHibernateTransactionManager,它需要sessionFactory
而且它没有ContextSourceAndJPATransactionManager
当我将ContextSourceAndDataSourceTransactionManager与为LocalContainerEntityManagerfactorybean配置的相同数据源一起使用时,它甚至不保留记录!
我不确定是否可以使用JTATransactionManager,因为LDAP不支持XA.
我的临时解决方案是在DAO层上使用JPATransactionManager并在服务层上使用LDAPTransactionManager.并确保在服务层中最后一个调用JPA DAO.
如果您愿意,我可以提供代码片段.
谢谢最佳答案spring-ldap-1.3.1 documentation的6.3点告诉使用
ContextSourceAndDataSourceTransactionManager,用于“ jdbc-ldap” tx目的. spring-ldap-core-1.3.1还具有ContextSourceAndHibernateTransactionManager.
展望这两个,一个人可以轻松创建自己的
ContextSourceAndJpaTransactionManager
并将其配置为
<bean ID="jpaUnderLdapTransactionManager" > <property name="contextSource" ref="ldapSimpleContextSource"/> <property name="entityManagerFactory" ref="entityManagerFactory"/></bean><tx:annotation-driven transaction-manager="jpaUnderLdapTransactionManager"/>
玩得开心!
ps.我差点忘了
public class ContextSourceAndJpaTransactionManager extends JpaTransactionManager{private static final long serialVersionUID = 1L;private ContextSourceTransactionManagerDelegate ldapManagerDelegate = new ContextSourceTransactionManagerDelegate();/** * @see org.springframework.orm.jpa.JpaTransactionManager#isExistingTransaction(Object) */protected boolean isExistingTransaction(Object transaction){ ContextSourceAndJpaTransactionObject actualTransactionObject = (ContextSourceAndJpaTransactionObject) transaction; return super.isExistingTransaction(actualTransactionObject .getJpaTransactionObject());}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doGetTransaction() */protected Object doGetTransaction() throws TransactionException{ Object dataSourceTransactionObject = super.doGetTransaction(); Object contextSourceTransactionObject = ldapManagerDelegate.doGetTransaction(); return new ContextSourceAndJpaTransactionObject( contextSourceTransactionObject,dataSourceTransactionObject );}/** * @see org.springframework.orm.jpa.JpaTransactionManager#dobegin(java.lang.Object,* org.springframework.transaction.TransactionDeFinition) */protected voID dobegin(Object transaction,TransactionDeFinition deFinition) throws TransactionException{ ContextSourceAndJpaTransactionObject actualTransactionObject = (ContextSourceAndJpaTransactionObject) transaction; super.dobegin(actualTransactionObject.getJpaTransactionObject(),deFinition); ldapManagerDelegate.dobegin( actualTransactionObject.getLdapTransactionObject(),deFinition );}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doCleanupAfterCompletion(java.lang.Object) */protected voID doCleanupAfterCompletion(Object transaction){ ContextSourceAndJpaTransactionObject actualTransactionObject = (ContextSourceAndJpaTransactionObject) transaction; super.doCleanupAfterCompletion(actualTransactionObject .getJpaTransactionObject()); ldapManagerDelegate.doCleanupAfterCompletion(actualTransactionObject .getLdapTransactionObject());}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doCommit(org.springframework.transaction.support.DefaultTransactionStatus) */protected voID doCommit(DefaultTransactionStatus status) throws TransactionException{ ContextSourceAndJpaTransactionObject actualTransactionObject = (ContextSourceAndJpaTransactionObject) status.getTransaction(); try { super.doCommit(new DefaultTransactionStatus( actualTransactionObject.getJpaTransactionObject(),status.isNewTransaction(),status.isNewSynchronization(),status.isReadonly(),status.isDeBUG(),status.getSuspendedResources()) ); } catch (TransactionException ex) { if (isRollbackOnCommitFailure()) { logger.deBUG("Failed to commit db resource,rethrowing",ex); // If we are to rollback on commit failure,just rethrow the // exception - this will cause a rollback to be performed on // both resources. throw ex; } else { logger.warn( "Failed to commit and resource is rollbackOnCommit not set -" + " proceeding to commit ldap resource."); } } ldapManagerDelegate.doCommit(new DefaultTransactionStatus( actualTransactionObject.getLdapTransactionObject(),status.getSuspendedResources()) );}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doRollback(org.springframework.transaction.support.DefaultTransactionStatus) */protected voID doRollback(DefaultTransactionStatus status) throws TransactionException{ ContextSourceAndJpaTransactionObject actualTransactionObject = (ContextSourceAndJpaTransactionObject) status.getTransaction(); super.doRollback(new DefaultTransactionStatus( actualTransactionObject.getJpaTransactionObject(),status.getSuspendedResources()) ); ldapManagerDelegate.doRollback(new DefaultTransactionStatus( actualTransactionObject.getLdapTransactionObject(),status.getSuspendedResources()) );}@SuppressWarnings("UnusedDeclaration")public ContextSource getContextSource(){ return ldapManagerDelegate.getContextSource();}public voID setContextSource(ContextSource contextSource){ ldapManagerDelegate.setContextSource(contextSource);}@SuppressWarnings("UnusedDeclaration")protected voID setRenamingStrategy(TempEntryRenamingStrategy renamingStrategy){ ldapManagerDelegate.setRenamingStrategy(renamingStrategy);}private final static class ContextSourceAndJpaTransactionObject{ private Object ldapTransactionObject; private Object jpaTransactionObject; public ContextSourceAndJpaTransactionObject( Object ldapTransactionObject,Object jpaTransactionObject) { this.ldapTransactionObject = ldapTransactionObject; this.jpaTransactionObject = jpaTransactionObject; } public Object getJpaTransactionObject() { return jpaTransactionObject; } public Object getLdapTransactionObject() { return ldapTransactionObject; }}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doSuspend(java.lang.Object) */protected Object doSuspend(Object transaction) throws TransactionException{ throw new TransactionSuspensionNotSupportedException( "Transaction manager [" + getClass().getname() + "] does not support transaction suspension");}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doResume(java.lang.Object,java.lang.Object) */protected voID doResume(Object transaction,Object suspendedResources) throws TransactionException{ throw new TransactionSuspensionNotSupportedException( "Transaction manager [" + getClass().getname() + "] does not support transaction suspension");}/** * @see org.springframework.orm.jpa.JpaTransactionManager#doSetRollbackOnly(org.springframework.transaction.support.DefaultTransactionStatus) */@OverrIDeprotected voID doSetRollbackOnly(DefaultTransactionStatus status){ super.doSetRollbackOnly( new DefaultTransactionStatus( ((ContextSourceAndJpaTransactionObject)status.getTransaction()) .getJpaTransactionObject(),status.getSuspendedResources()) );}}
总结 以上是内存溢出为你收集整理的java-如何执行Spring LDAP和JPA事务 全部内容,希望文章能够帮你解决java-如何执行Spring LDAP和JPA事务 所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)