Java – spring managed transaction, eclipse link JPA, custom isolation level
I doubt it's embarrassing. I made a mistake in a terrible way, but please wait for me patiently
I have a spring application with spring managed transactions It uses eclipse link JPA I have a method that executes findbynativequery () followed by merge () I need to do this at the true serial transaction isolation level I tried to add @ transactional (isolation = isolation. Serializable)
This doesn't work because org springframework. orm. jpa. vendor. Eclipse linkjpadialect #beatransaction does not support any transaction isolation level, but the default value is Then I tried to use unitofwork inside elcipselink and start / write my own transaction, but then I received an error:
"java.lang.IllegalStateException : Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
Of course that makes sense... But what should I do?
Solution
I've tried this, but I'm not entirely sure about the solution I got the code from this blog and adapted it into eclipse link This is the code:
package com.byteslounge.spring.tx.dialect;
import java.sql.sqlException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect;
import org.springframework.transaction.TransactionDeFinition;
import org.springframework.transaction.TransactionException;
public class CustomEclipseLinkJpaDialect extends EclipseLinkJpaDialect {
private static final long serialVersionUID = 1L;
private boolean lazyDatabaseTransaction = false;
@Override
public void setLazyDatabaseTransaction(boolean lazyDatabaseTransaction) {
this.lazyDatabaseTransaction = lazyDatabaseTransaction;
}
@Override
public Object beginTransaction(final EntityManager entityManager,final TransactionDeFinition deFinition)
throws PersistenceException,sqlException,TransactionException {
UnitOfWork uow = (UnitOfWork) getSession(entityManager);
uow.getLogin().setTransactionIsolation(deFinition.getIsolationLevel());
entityManager.getTransaction().begin();
if (!deFinition.isReadOnly() && !lazyDatabaseTransaction) {
uow.beginEarlyTransaction();
}
return null;
}
}
I found that serializable isolation is recorded when the transaction starts, but it needs to be properly tested to confirm its effectiveness
