| An UnsupportedOperationException is thrown on WebSphere Liberty, if an entity is persisted with a value, that causes a constaint violation in database (for example, if a column cannot hold a too long value). Pseudo example:
/*
* create table APP_JOBS {
* ID NUMBER(*,0) NOT NULL PRIMARY KEY,
* JOB VARCHAR2(10 CHAR)
* }
* /
appJobsEntity.setJob("IAmTooLongForColumn");
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
saveMethod(appJobsEntity) {
em.save(appJobsEntity);
}
//On save a exception is thrown: javax.ejb.EJBTransactionRolledbackException: nested exception is: javax.transaction.RollbackException at com.ibm.ejs.container.BusinessExceptionMappingStrategy.mapCSIException(BusinessExceptionMappingStrategy.java:124) at com.ibm.ejs.container.BusinessExceptionMappingStrategy.mapCSITransactionRolledBackException(BusinessExceptionMappingStrategy.java:584) at com.ibm.ejs.container.EJSDeployedSupport.mapCSITransactionRolledBackException(EJSDeployedSupport.java:600) at com.ibm.ejs.container.EJSContainer.postInvokeRolledbackException(EJSContainer.java:4382) at com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4073) .... Caused by: java.lang.UnsupportedOperationException at org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.setRollbackOnly(WebSphereExtendedJtaPlatform.java:121) at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionAdapterTransactionManagerImpl.markRollbackOnly(JtaTransactionAdapterTransactionManagerImpl.java:100) Unlike the prior versions WebSphere Liberty 8.5.5.7 seems to provide access to the TransactionManager to support the rollback operation. Suggested improvement of Hibernate: Add a WebSphereLibertyJtaPlatform like the one below (working example; jndi lookup didnt worked in my environment):
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform;
import com.ibm.tx.jta.TransactionManagerFactory;
import com.ibm.tx.jta.UserTransactionFactory;
public class WebSphereLibertyJtaPlatform extends AbstractJtaPlatform {
@Override
protected TransactionManager locateTransactionManager() {
return TransactionManagerFactory.getTransactionManager();
}
@Override
protected UserTransaction locateUserTransaction() {
return UserTransactionFactory.getUserTransaction();
}
}
|