mirror of https://github.com/apache/openjpa.git
test cases for agreed-upon callback behavior
git-svn-id: https://svn.apache.org/repos/asf/incubator/openjpa/trunk@504411 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c13e2baab7
commit
485cfd37ca
|
@ -0,0 +1,57 @@
|
||||||
|
package org.apache.openjpa.persistence.callbacks;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.PostLoad;
|
||||||
|
import javax.persistence.PrePersist;
|
||||||
|
import javax.persistence.PreUpdate;
|
||||||
|
import javax.persistence.Version;
|
||||||
|
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class ExceptionsFromCallbacksEntity {
|
||||||
|
@Id private long id;
|
||||||
|
@Version private int version;
|
||||||
|
private boolean throwOnPrePersist;
|
||||||
|
private boolean throwOnPreUpdate;
|
||||||
|
private boolean throwOnPostLoad;
|
||||||
|
private String stringField;
|
||||||
|
|
||||||
|
public void setThrowOnPrePersist(boolean b) {
|
||||||
|
throwOnPrePersist = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThrowOnPostLoad(boolean b) {
|
||||||
|
throwOnPostLoad = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThrowOnPreUpdate(boolean b) {
|
||||||
|
throwOnPreUpdate = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStringField(String s) {
|
||||||
|
stringField = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PrePersist
|
||||||
|
public void prePersist() {
|
||||||
|
if (throwOnPrePersist)
|
||||||
|
throw new CallbackTestException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreUpdate
|
||||||
|
public void preUpdate() {
|
||||||
|
if (throwOnPreUpdate)
|
||||||
|
throw new CallbackTestException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostLoad
|
||||||
|
public void postLoad() {
|
||||||
|
if (throwOnPostLoad)
|
||||||
|
throw new CallbackTestException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CallbackTestException
|
||||||
|
extends RuntimeException {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
package org.apache.openjpa.persistence.callbacks;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.Persistence;
|
||||||
|
import javax.persistence.RollbackException;
|
||||||
|
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAPersistence;
|
||||||
|
import org.apache.openjpa.persistence.callbacks.ExceptionsFromCallbacksEntity.CallbackTestException;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests against JPA section 3.5's description of callback exception handling.
|
||||||
|
*/
|
||||||
|
public class TestExceptionsFromCallbacks
|
||||||
|
extends TestCase {
|
||||||
|
|
||||||
|
private OpenJPAEntityManagerFactory emf;
|
||||||
|
|
||||||
|
public void setUp() {
|
||||||
|
String types = ExceptionsFromCallbacksEntity.class.getName();
|
||||||
|
Map props = new HashMap(System.getProperties());
|
||||||
|
props.put("openjpa.MetaDataFactory", "jpa(Types=" + types + ")");
|
||||||
|
emf = (OpenJPAEntityManagerFactory) Persistence.
|
||||||
|
createEntityManagerFactory("test", props);
|
||||||
|
deleteAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tearDown() {
|
||||||
|
if (emf == null)
|
||||||
|
return;
|
||||||
|
try {
|
||||||
|
deleteAll();
|
||||||
|
emf.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteAll() {
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
em.createQuery("delete from ExceptionsFromCallbacksEntity").
|
||||||
|
executeUpdate();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPrePersistException() {
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
ExceptionsFromCallbacksEntity o = new ExceptionsFromCallbacksEntity();
|
||||||
|
o.setThrowOnPrePersist(true);
|
||||||
|
try {
|
||||||
|
em.persist(o);
|
||||||
|
fail("persist should have failed");
|
||||||
|
} catch (CallbackTestException cte) {
|
||||||
|
// transaction should be still active, but marked for rollback
|
||||||
|
assertTrue(em.getTransaction().isActive());
|
||||||
|
assertTrue(em.getTransaction().getRollbackOnly());
|
||||||
|
} finally {
|
||||||
|
if (em.getTransaction().isActive())
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPreUpdateExceptionDuringFlush() {
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
ExceptionsFromCallbacksEntity o = new ExceptionsFromCallbacksEntity();
|
||||||
|
o.setThrowOnPreUpdate(true);
|
||||||
|
em.persist(o);
|
||||||
|
o.setStringField("foo");
|
||||||
|
try {
|
||||||
|
em.flush();
|
||||||
|
fail("flush should have failed");
|
||||||
|
} catch (CallbackTestException cte) {
|
||||||
|
// transaction should be still active, but marked for rollback
|
||||||
|
assertTrue(em.getTransaction().isActive());
|
||||||
|
assertTrue(em.getTransaction().getRollbackOnly());
|
||||||
|
} finally {
|
||||||
|
if (em.getTransaction().isActive())
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPreUpdateExceptionDuringCommit() {
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
ExceptionsFromCallbacksEntity o = new ExceptionsFromCallbacksEntity();
|
||||||
|
o.setThrowOnPreUpdate(true);
|
||||||
|
em.persist(o);
|
||||||
|
o.setStringField("foo");
|
||||||
|
try {
|
||||||
|
em.getTransaction().commit();
|
||||||
|
fail("commit should have failed");
|
||||||
|
} catch (RollbackException re) {
|
||||||
|
assertEquals(CallbackTestException.class,
|
||||||
|
re.getCause().getClass());
|
||||||
|
|
||||||
|
// transaction should be rolled back at this point
|
||||||
|
assertFalse(em.getTransaction().isActive());
|
||||||
|
} finally {
|
||||||
|
if (em.getTransaction().isActive())
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPostLoadException() {
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
ExceptionsFromCallbacksEntity o = new ExceptionsFromCallbacksEntity();
|
||||||
|
o.setThrowOnPostLoad(true);
|
||||||
|
em.persist(o);
|
||||||
|
em.getTransaction().commit();
|
||||||
|
Object oid = OpenJPAPersistence.cast(em).getObjectId(o);
|
||||||
|
em.close();
|
||||||
|
|
||||||
|
em = emf.createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
try {
|
||||||
|
o = em.find(ExceptionsFromCallbacksEntity.class, oid);
|
||||||
|
fail("find should have failed");
|
||||||
|
} catch (CallbackTestException cte) {
|
||||||
|
// transaction should be active but marked for rollback
|
||||||
|
assertTrue(em.getTransaction().isActive());
|
||||||
|
assertTrue(em.getTransaction().getRollbackOnly());
|
||||||
|
} finally {
|
||||||
|
if (em.getTransaction().isActive())
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue