本是甚是喜欢JPA简单方便明了,所以在LDAP项目要加上MySQL数据库,但LDAP没有与jpa连用的事物处理 是一个很头疼的事,找到源码 发现里面只有2种对组合事物的支持:
ContextSourceAndDataSourceTransactionManager LDAP与JDBC的组合支持
ContextSourceAndHibernateTransactionManager LDAP与Hibernate的组合支持
推荐阅读:
RedHat6下构建LDAP服务
Zimbra故障——Unable to determine enabled services from LDAP
如果使用这个 就是要说自己还要去封装jdbc 非常不爽,所以找到了个老外给的解决方法,自己写一个方法,来完成LDAP与JPA的组事物,下面就是 那段代码
import org.springframework.ldap.core.ContextSource;
import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy;
import org.springframework.ldap.transaction.compensating.manager.ContextSourceTransactionManagerDelegate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionSuspensionNotSupportedException;
import org.springframework.transaction.support.DefaultTransactionStatus;
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.isNewTransaction(),
status.isNewSynchronization(),
status.isReadOnly(),
status.isDebug(),
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.isNewTransaction(),
status.isNewSynchronization(),
status.isReadOnly(),
status.isDebug(),
status.getSuspendedResources())
);
ldapManagerDelegate.doRollback(new DefaultTransactionStatus(
actualTransactionObject.getLdapTransactionObject(),
status.isNewTransaction(),
status.isNewSynchronization(),
status.isReadOnly(),
status.isDebug(),
status.getSuspendedResources())
);
}
public ContextSource getContextSource()
{
return ldapManagerDelegate.getContextSource();
}
public void setContextSource(ContextSource contextSource)
{
ldapManagerDelegate.setContextSource(contextSource);
}
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)
*/
@Override
protected void doSetRollbackOnly(DefaultTransactionStatus status)
{
super.doSetRollbackOnly(
new DefaultTransactionStatus(
((ContextSourceAndJpaTransactionObject)status.getTransaction())
.getJpaTransactionObject(),
status.isNewTransaction(),
status.isNewSynchronization(),
status.isReadOnly(),
status.isDebug(),
status.getSuspendedResources())
);
}
}