Additional test cases for createQuery and find in Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java
diff --git a/Temporal Entity Example/src/temporal/TemporalEntityManager.java b/Temporal Entity Example/src/temporal/TemporalEntityManager.java
index 4acc081..dc22d48 100644
--- a/Temporal Entity Example/src/temporal/TemporalEntityManager.java
+++ b/Temporal Entity Example/src/temporal/TemporalEntityManager.java
@@ -19,6 +19,7 @@
import java.lang.reflect.Member;
import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery;
@@ -439,7 +440,11 @@
Query query = createNamedQuery(descriptor.getAlias() + ".find");
query.setParameter("ID", primaryKey);
- return (T) query.getSingleResult();
+ try {
+ return (T) query.getSingleResult();
+ } catch (NoResultException nre) {
+ return null;
+ }
}
return (T) super.find(entityClass, primaryKey);
diff --git a/Temporal Entity Example/src/temporal/persistence/DescriptorHelper.java b/Temporal Entity Example/src/temporal/persistence/DescriptorHelper.java
index 3585bb9..c61b60b 100644
--- a/Temporal Entity Example/src/temporal/persistence/DescriptorHelper.java
+++ b/Temporal Entity Example/src/temporal/persistence/DescriptorHelper.java
@@ -98,20 +98,24 @@
public static ClassDescriptor getEditionDescriptor(Session session, Class<?> entityClass) {
return getDescriptor(session, entityClass, EDITION);
}
-
+
+ public static ClassDescriptor getEditionViewDescriptor(Session session, Class<?> entityClass) {
+ return getDescriptor(session, entityClass, EDITION_VIEW);
+ }
+
/**
- * TODO
+ * Lookup the descriptor based on the object taking into account the
+ * possibility of wrappers being used.
*/
public static ClassDescriptor getClassDescriptor(Session session, Object entity) {
Object domainObject = entity;
-
+
if (Proxy.isProxyClass(entity.getClass())) {
InvocationHandler handler = Proxy.getInvocationHandler(entity);
-
+
if (handler instanceof EditionWrapperPolicy.Handler<?>) {
domainObject = ((EditionWrapperPolicy.Handler<?>) handler).getEntity();
- }
- else if (handler instanceof CurrentWrapperPolicy.CurrentWrapperHandler) {
+ } else if (handler instanceof CurrentWrapperPolicy.CurrentWrapperHandler) {
domainObject = ((CurrentWrapperPolicy.CurrentWrapperHandler<?>) handler).getEntity();
}
}
diff --git a/Temporal Tests/src/tests/FullPersonWithEditions.java b/Temporal Tests/src/tests/FullPersonWithEditions.java
index 79ddb2b..db353e9 100644
--- a/Temporal Tests/src/tests/FullPersonWithEditions.java
+++ b/Temporal Tests/src/tests/FullPersonWithEditions.java
@@ -611,6 +611,7 @@
Assert.assertNotNull(es);
Assert.assertTrue(es.getEntries().isEmpty());
+ em.getTransaction().begin();
Person pAtT5 = em.newEdition(pEdition);
Assert.assertNotNull(pAtT5);
diff --git a/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java b/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java
index f498740..ca8dcb0 100644
--- a/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java
+++ b/Temporal Tests/src/tests/internal/TemporalEntityManagerTests.java
@@ -27,13 +27,18 @@
import static temporal.Effectivity.EOT;
import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.TypedQuery;
import junit.framework.Assert;
import model.Person;
import model.PersonHobby;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork;
+import org.eclipse.persistence.queries.ObjectLevelReadQuery;
import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.sessions.server.ClientSession;
import org.eclipse.persistence.sessions.server.Server;
@@ -41,6 +46,7 @@
import temporal.EditionSet;
import temporal.TemporalEntityManager;
+import temporal.persistence.DescriptorHelper;
import tests.BaseTestCase;
/**
@@ -189,7 +195,7 @@
TemporalEntityManager em = getEntityManager();
em.setEffectiveTime(T3);
EditionSet esT3 = em.getEditionSet();
-
+
em.getTransaction().begin();
Person newPersonAtT3 = em.newEntity(Person.class);
@@ -199,10 +205,10 @@
em.setEffectiveTime(T4);
EditionSet esT4 = em.getEditionSet();
-
+
Assert.assertFalse(esT4.hasChanges());
Assert.assertTrue(esT3.hasChanges());
-
+
em.flush();
}
@@ -221,4 +227,74 @@
// TODO : ?
em.getTransaction().rollback();
}
+
+ /**
+ * Verify proper query construction using interface alias. The concrete type
+ * queried will depend on the state (effective time) of the
+ * {@link TemporalEntityManager}
+ */
+ @Test
+ public void createQuery_Person() {
+ TemporalEntityManager em = getEntityManager();
+
+ // Current Query
+ TypedQuery<Person> query = em.createQuery("SELECT p FROM Person p", Person.class);
+ Assert.assertNotNull(query);
+ ClassDescriptor desc = DescriptorHelper.getCurrentDescriptor(em.unwrap(Session.class), Person.class);
+ Assert.assertSame(desc.getJavaClass(), query.unwrap(ObjectLevelReadQuery.class).getReferenceClass());
+ Assert.assertSame(desc, query.unwrap(ObjectLevelReadQuery.class).getDescriptor());
+
+ // Edition Query
+ em.setEffectiveTime(T1);
+ query = em.createQuery("SELECT p FROM Person p", Person.class);
+ Assert.assertNotNull(query);
+ desc = DescriptorHelper.getEditionDescriptor(em.unwrap(Session.class), Person.class);
+ Assert.assertSame(desc.getJavaClass(), query.unwrap(ObjectLevelReadQuery.class).getReferenceClass());
+ Assert.assertSame(desc, query.unwrap(ObjectLevelReadQuery.class).getDescriptor());
+
+ // Current Query again
+ em.clearEffectiveTime();
+ query = em.createQuery("SELECT p FROM Person p", Person.class);
+ Assert.assertNotNull(query);
+ desc = DescriptorHelper.getCurrentDescriptor(em.unwrap(Session.class), Person.class);
+ Assert.assertSame(desc.getJavaClass(), query.unwrap(ObjectLevelReadQuery.class).getReferenceClass());
+ Assert.assertSame(desc, query.unwrap(ObjectLevelReadQuery.class).getDescriptor());
+ }
+
+ @Test
+ public void createQuery_PersonEdition() {
+ TemporalEntityManager em = getEntityManager();
+
+ // Current Query
+ TypedQuery<Person> query = em.createQuery("SELECT p FROM PersonEdition p", Person.class);
+ Assert.assertNotNull(query);
+ ClassDescriptor desc = DescriptorHelper.getEditionDescriptor(em.unwrap(Session.class), Person.class);
+ Assert.assertSame(desc.getJavaClass(), query.unwrap(ObjectLevelReadQuery.class).getReferenceClass());
+ Assert.assertSame(desc, query.unwrap(ObjectLevelReadQuery.class).getDescriptor());
+ }
+
+ @Test
+ public void createQuery_PersonEditionView() {
+ TemporalEntityManager em = getEntityManager();
+
+ // Current Query
+ TypedQuery<Person> query = em.createQuery("SELECT p FROM PersonEditionView p", Person.class);
+ Assert.assertNotNull(query);
+ ClassDescriptor desc = DescriptorHelper.getEditionViewDescriptor(em.unwrap(Session.class), Person.class);
+ Assert.assertSame(desc.getJavaClass(), query.unwrap(ObjectLevelReadQuery.class).getReferenceClass());
+ Assert.assertSame(desc, query.unwrap(ObjectLevelReadQuery.class).getDescriptor());
+ }
+
+ /**
+ * Ensure the find of a non-existent edition returns null and not the
+ * {@link NoResultException} thrown by the .find named query execution.
+ */
+ @Test
+ public void findNonExistent() {
+ TemporalEntityManager em = getEntityManager();
+ em.setEffectiveTime(T3);
+
+ Person result = em.find(Person.class, 123456789l);
+ Assert.assertNull(result);
+ }
}
diff --git a/Temporal Tests/src/tests/internal/VerifyConfigTests.java b/Temporal Tests/src/tests/internal/VerifyConfigTests.java
index a4a8809..20d4c59 100644
--- a/Temporal Tests/src/tests/internal/VerifyConfigTests.java
+++ b/Temporal Tests/src/tests/internal/VerifyConfigTests.java
@@ -233,5 +233,15 @@
// TODO: Verify FK fields
}
+
+ /**
+ * Important that JPQL caching is disabled to ensure
+ */
+ @Test
+ public void verifyJPQLCcaheingDisabled() {
+ Server session = JpaHelper.getServerSession(getEMF());
+ Assert.assertEquals(0, session.getProject().getJPQLParseCacheMaxSize());
+ }
+
}
diff --git a/Temporal WAR/WebContent/index.xhtml b/Temporal WAR/WebContent/index.xhtml
index 0148385..7281997 100644
--- a/Temporal WAR/WebContent/index.xhtml
+++ b/Temporal WAR/WebContent/index.xhtml
@@ -40,6 +40,7 @@
<f:facet name="header">Effectivity</f:facet>
<h:outputText value="#{person.effectivity}"></h:outputText>
</h:column>
+ <f:facet name="footer"><div align="right"><h:commandLink action="create-edition" value="Create"/></div></f:facet>
</h:dataTable>
</h:form>
</p>
@@ -71,9 +72,9 @@
<h:outputText value="#{person.effectivity}" />
</h:column>
</h:dataTable>
-
+<p/>
<h:dataTable value="#{persistenceBean.allEditions}" var="person"
- bgcolor="whitesmoke" border="2" width="400">
+ bgcolor="whitesmoke" border="2" width="600">
<f:facet name="header">
<h:outputText value="All Future Person Editions"></h:outputText>
</f:facet>
@@ -97,6 +98,10 @@
<f:facet name="header">Effectivity</f:facet>
<h:outputText value="#{person.effectivity}" />
</h:column>
+ <h:column>
+ <h:commandButton value="Edit"/>
+ <h:commandButton value="Delete"/>
+ </h:column>
</h:dataTable>
</h:form>
diff --git a/Temporal WAR/src/temporal/web/CreateEditionBean.java b/Temporal WAR/src/temporal/web/CreateEditionBean.java
index c28a14f..fc3a355 100644
--- a/Temporal WAR/src/temporal/web/CreateEditionBean.java
+++ b/Temporal WAR/src/temporal/web/CreateEditionBean.java
@@ -15,7 +15,6 @@
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
-import model.Person;
import temporal.ejb.PersonService;
@ManagedBean
@@ -64,6 +63,6 @@
public String create() {
getService().create(getId(), getName(), getEffective());
- return "success";
+ return "index?faces-redirect=true";
}
}