* Validates that a mix of access types can be used within
* an inheritance hierarchy which uses default Entity inheritance.
* NOTE: be sure to test with all forms of inheritance.
*/
public void testEntityPropertyDefaultInheritance() {
OpenJPAEntityManagerSPI em = emf.createEntityManager();
PropertySub3 ps = new PropertySub3();
// Call super setter with underlying field access
ps.setName("EntitySuperName");
// Call base setter with property access
Date now = new Date();
ps.setCreateDate(now);
SuperFieldEntity sfe = new SuperFieldEntity();
sfe.setName("SuperFieldEntity");
em.getTransaction().begin();
em.persist(ps);
em.persist(sfe);
em.getTransaction().commit();
em.clear();
// This value of a persistent field was set using the setter
// above, but this query will use the property name to verify that
// propety access is in use.
Query qry = em.createNamedQuery("PropertySub3.query");
qry.setParameter("id", ps.getId());
qry.setParameter("name", "EntitySuperName");
qry.setParameter("crtDate", now);
PropertySub3 ps2 =
(PropertySub3)qry.getSingleResult();
assertEquals(ps, ps2);
assertEquals(ps2.getName(), "EntitySuperName");
assertEquals(ps2.getCreateDate().toString(), now.toString());
try {
qry = em.createNamedQuery("PropertySub3.badQuery");
qry.setParameter("id", ps.getId());
qry.setParameter("name", "EntitySuperName");
qry.setParameter("crtDate", now);
qry.getSingleResult();
fail("Usage of this query should have thrown an exception");
}
catch (Exception e) {
assertExceptionMessage(e, ArgumentException.class,
"No field named \"crtDate\" in \"PropertySub3\"",
"[createDate, id, name]");
}
qry = em.createNamedQuery("SuperFieldEntity.query");
qry.setParameter("id", sfe.getId());
qry.setParameter("name", "SuperFieldEntity");
SuperFieldEntity sfe2 =
(SuperFieldEntity)qry.getSingleResult();
assertEquals(sfe2, sfe2);
assertEquals(sfe2.getName(), "SuperFieldEntity");
try {
// This query ensures that a subclass property didn't somehow get
// picked up by the superclass while building field metadata using
// explicit access.
qry = em.createNamedQuery("SuperFieldEntity.badQuery");
qry.setParameter("id", sfe.getId());
qry.setParameter("name", "SuperFieldEntity");
qry.setParameter("crtDate", now);
qry.getSingleResult();
fail("Usage of this query should have thrown an exception");
}
catch (Exception e) {
assertExceptionMessage(e, ArgumentException.class,
"No field named \"crtDate\" in \"SuperFieldEntity\"",
"[id, name]");
}
em.close();
}