|
|
get RollbackException when using java.util.UUID as @Id in EclipseLink
mons.util;
import java.util.UUID;
import java.util.Vector;
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.internal.databaseaccess.Accessor;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.sequencing.Sequence;
import org.eclipse.persistence.sessions.Session;
public class UUIDSequence extends Sequence implements SessionCustomizer {
/*** */
private static final long serialVersionUID = 5729587860390749237L;
public UUIDSequence() {
super();
}
public UUIDSequence(String name) {
super(name);
}
/** (non-Javadoc)* * @see* org.eclipse.persistence.config.SessionCustomizer#customize(org.eclipse* .persistence.sessions.Session)*/
@Override
public void customize(Session session) throws Exception {
UUIDSequence sequence = new UUIDSequence(quot;system-uuidquot;);
session.getLogin().addSequence(sequence);
}
/** (non-Javadoc)* * @see* org.eclipse.persistence.sequencing.Sequence#shouldAcquireValueAfterInsert* ()*/
@Override
public boolean shouldAcquireValueAfterInsert() {
return false;
}
/** (non-Javadoc)* * @see org.eclipse.persistence.sequencing.Sequence#shouldUseTransaction()*/
@Override
public boolean shouldUseTransaction() {
return false;
}
/** (non-Javadoc)* * @see* org.eclipse.persistence.sequencing.Sequence#getGeneratedValue(org.eclipse* .persistence.internal.databaseaccess.Accessor,* org.eclipse.persistence.internal.sessions.AbstractSession,* java.lang.String)*/
@Override
public Object getGeneratedValue(Accessor accessor,
AbstractSession writeSession, String seqName) {
return UUID.fromString(UUID.randomUUID().toString().toUpperCase());
}
/** (non-Javadoc)* * @see* org.eclipse.persistence.sequencing.Sequence#getGeneratedVector(org.eclipse* .persistence.internal.databaseaccess.Accessor,* org.eclipse.persistence.internal.sessions.AbstractSession,* java.lang.String, int)*/
@SuppressWarnings(quot;rawtypesquot;)
@Override
public Vector getGeneratedVector(Accessor accessor,
AbstractSession writeSession, String seqName, int size) {
return null;
}
/** (non-Javadoc)* * @see org.eclipse.persistence.sequencing.Sequence#onConnect()*/
@Override
public void onConnect() {
}
/** (non-Javadoc)* * @see org.eclipse.persistence.sequencing.Sequence#onDisconnect()*/
@Override
public void onDisconnect() {
}
}
I have change the following method ... but it does not make difference and I get same errorCode:
@Override
public Object getGeneratedValue(Accessor accessor,
AbstractSession writeSession, String seqName) {
return UUID.fromString(UUID.randomUUID().toString().toUpperCase());
}
And my entity which I wish to use UUID instead of int/String as Id is as followed:Code:
/*** Copyright (©) 2011 Lantmäteriet* @author shesol* @date 31 jan 2011*/
package se.lantmateriet.milins.domain.xml;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import org.eclipse.persistence.annotations.Cache;
import org.eclipse.persistence.annotations.CacheType;
import se.lantmateriet.milins.commons.enums.ExchangeObjectType;
import se.lantmateriet.milins.commons.status.TransactionStatus;
import se.lantmateriet.milins.domain.DomainObject;
@Entity
@Cache(type = CacheType.FULL)
@Table(name = quot;MIGR_XML_OBJECTquot;)
public class XmlObject implements DomainObject {
/*** */
private static final long serialVersionUID = 3035242482400561838L;
private UUID id;
private ExchangeObjectType objectType;
private TransactionStatus transactionStatus;
private String xmlFile;
/*** */
public XmlObject() {
// this.id = UUID.randomUUID();
// LoggerFactory.getLogger(XmlObject.class).debug(quot;UUID = quot; + this.id);
}
/*** @return the id*/
@Id
@Column(name = quot;UUIDquot;)
@GeneratedValue(generator = quot;system-uuidquot;)
public UUID getId() {
return id;
}
/*** @param id* the id to set*/
public void setId(UUID id) {
this.id = id;
}
/*** @return the objectType*/
@Column(name = quot;OBJECT_TYPEquot;)
@Enumerated(EnumType.STRING)
public ExchangeObjectType getObjectType() {
return objectType;
}
/*** @param objectType* the objectType to set*/
public void setObjectType(ExchangeObjectType objectType) {
this.objectType = objectType;
}
/*** @return the transactionStatus*/
@Column(name = quot;TRANSACTION_STATUSquot;)
@Enumerated(EnumType.STRING)
public TransactionStatus getTransactionStatus() {
return transactionStatus;
}
/*** @param transactionStatus* the transactionStatus to set*/
public void setTransactionStatus(TransactionStatus transactionStatus) {
this.transactionStatus = transactionStatus;
}
/*** @return the xmlFile*/
@Column(name = quot;XML_FILEquot;, columnDefinition = quot;CLOBquot;)
@Lob
public String getXmlFile() {
return xmlFile;
}
/*** @param xmlFile* the xmlFile to set*/
public void setXmlFile(String xmlFile) {
this.xmlFile = xmlFile;
}
}
As u see I am using the sequence as followed
Code:
/*** @return the id*/
@Id
@Column(name = quot;UUIDquot;)
@GeneratedValue(generator = quot;system-uuidquot;)
public UUID getId() {
return id;
}
And I have a dao and and finally a service which I will save an xmlObject to the DB.
My persistence.xml looks like
HTML Code:
lt;persistence-unit name=quot;milins-domainquot;
transaction-type=quot;RESOURCE_LOCALquot;gt;
lt;providergt;org.eclipse.persistence.jpa.PersistenceProvider lt;/providergt; lt;propertiesgt; lt;property name=quot;eclipselink.session.customizerquot; value=quot;se.lantmateriet.milins.commons.util.UUIDSequencequot;/gt; lt;/propertiesgt;
lt;classgt;se.lantmateriet.milins.domain.xml.XmlObjectlt;/classgt;
lt;classgt;se.lantmateriet.milins.domain.xml.Transactionlt;/classgt;
lt;/persistence-unitgt;
remaining of this post will be posted after that
mit(AbstractPlatformTransactionManager.java:723)
at org..test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:515)
at org..test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:290)
at org..test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:183)
at org..test.context.TestContextManager.afterTestMethod(TestContextManager.java:406)
at org..test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:90)
at org..test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org..test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org..test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org..test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org..test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly.
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:92)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
at org..orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:467)
... 25 moreYou are leaving out your configuration of the service, dao and the service, dao as classes... |
|