I have two classes a Container type class and another class that is 'contained' by that class.
The contained class, CompoundKeyMapItem, represents an alternate implementation of an object held in a Map, and uses a Compound Primary Key.
The contained class therefore uses an @IdClass.
This all works fine on Eclipselink.
However when I try and run this in ObjectDb I get the following error;
Problem Creating Database [ObjectDB 2.2.9_05] javax.persistence.PersistenceException Conflicting modifiers for field uk.co.his.experiment8.cmdline.objdb.CompoundKeyMapItem.container (javax.persistence.Id, javax.persistence.ManyToOne) (error 322) at com.objectdb.jpa.EMImpl.persist(EMImpl.java:376) at uk.co.his.experiment8.cmdline.objdb.Container.mapItemsPutNew(Container.java:64) at uk.co.his.experiment8.cmdline.objdb.Container.generateMapItems(Container.java:54) at uk.co.his.experiment8.cmdline.CreateDatabaseTestObjOnObjectDb.main(CreateDatabaseTestObjOnObjectDb.java:18) Caused by: com.objectdb.o.UserException: Conflicting modifiers for field uk.co.his.experiment8.cmdline.objdb.CompoundKeyMapItem.container (javax.persistence.Id, javax.persistence.ManyToOne) at com.objectdb.o.MSG.d(MSG.java:61) at com.objectdb.o.JPA.d(JPA.java:385) at com.objectdb.o.SCM.r(SCM.java:258) at com.objectdb.o.TYS.n(TYS.java:282) at com.objectdb.o.TYM.ae(TYM.java:512) at com.objectdb.o.TYM.ac(TYM.java:458) at com.objectdb.o.TYM.ao(TYM.java:777) at com.objectdb.o.TYM.at(TYM.java:862) at com.objectdb.o.TYM.aw(TYM.java:934) at com.objectdb.o.OBM.bv(OBM.java:361) at com.objectdb.o.OBM.bv(OBM.java:249) at com.objectdb.jpa.EMImpl.persist(EMImpl.java:373) ... 3 more
What am I doing wrong?
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.FlushModeType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Query;
import javax.persistence.Version;
import uk.co.his.experiment8.common.TestException;
@Entity
@NamedQueries({
@NamedQuery(name = "numberOfMapItems", query = "SELECT COUNT(x) FROM CompoundKeyMapItem x") })
public class Container {
public static Container getInstance(EntityManager em) {
Container c = em.find(Container.class, "1");
if (c == null) {
c = new Container();
em.persist(c);
}
return c;
}
@Id
protected String id = "1";
@SuppressWarnings("unused")
// used by JPA
@Version
private int version;
@Basic
protected java.lang.Integer lastInstanceInMap;
protected Container() { // Empty constructor for JPA
}
public void generateMapItems(Integer numberToGen, EntityManager em)
throws TestException {
if (lastInstanceInMap == null) {
lastInstanceInMap = 0;
}
int endCnt = lastInstanceInMap + numberToGen;
int startCnt = lastInstanceInMap;
while (endCnt > startCnt) {
startCnt++;
mapItemsPutNew("" + startCnt, new CompoundKeyMapItem(startCnt), em);
lastInstanceInMap = startCnt;
}
}
private CompoundKeyMapItem mapItemsPutNew(java.lang.String key,
CompoundKeyMapItem newObj, EntityManager em) throws TestException {
newObj.setUUID();
newObj.setSingleton(this);
newObj.setCachedKey(key);
em.persist(newObj);
return newObj;
}
public CompoundKeyMapItem getMapItem(Integer cachedKey, EntityManager em) {
return em.find(CompoundKeyMapItem.class, new CompoundKeyMapItem.CompoundKeyMapItemId(cachedKey.toString(), id));
}
public Integer getLastMapInstanceKey() {
return lastInstanceInMap;
}
public int getNumberOfMapItems(EntityManager em) {
Query q = em
.createNamedQuery("numberOfMapItems");
q.setFlushMode(FlushModeType.AUTO);
try {
long l = (Long) q.getSingleResult();
if (l > Integer.MAX_VALUE)
return -1;
int i = (int) l;
return i;
} catch (javax.persistence.NoResultException ex) {
return -1;
}
}
}
mport java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.ManyToOne;
import javax.persistence.Version;
@Entity
@IdClass(CompoundKeyMapItem.CompoundKeyMapItemId.class)
public class CompoundKeyMapItem {
public static class CompoundKeyMapItemId implements Serializable {
private static final long serialVersionUID = 0L;
private String cachedKey;
private String container;
public CompoundKeyMapItemId() {}
public CompoundKeyMapItemId(String id, String parent) {
this.cachedKey = id;
this.container = parent;
}
@Override
public boolean equals(Object o) {
if(!(o instanceof CompoundKeyMapItemId)) return false;
CompoundKeyMapItemId other = (CompoundKeyMapItemId) o;
return container.equals(other.container) && cachedKey.equals(other.cachedKey);
}
@Override
public int hashCode() {
//Follow bloch Item 8.
int result = 17;
result = 37*result + cachedKey.hashCode();
result = 37*result + container.hashCode();
return result;
}
public String getCachedKey() {
return cachedKey;
}
public String getSingleton() {
return container;
}
}
@ManyToOne(fetch=FetchType.LAZY)
@Id
private Container container;
@Basic
@Id
private String cachedKey
@Version
private int version;
@Basic
private Integer property;
@SuppressWarnings("unused") //JPA
private CompoundKeyMapItem() {
}
public CompoundKeyMapItem(int startCnt) {
property = startCnt;
}
public void setUUID() {
//Do nothing we do not have a separate ID
}
public Integer getJPAVersion() {
return version;
}
public void setSingleton(Container singleton) {
this.container = singleton;
}
public void setCachedKey(String key) {
this.cachedKey = key;
}
public String getCachedKey() {
return cachedKey;
}
public void setProperty(Integer newValue) {
property = newValue;
}
public Integer getProperty() {
return property;
}
public String getInfo() {
return "CompoundKeyMapItem: id=" + container.id + "/" + cachedKey + ", version=" + version + ", key=" + cachedKey + ", property=" + property;
}
}
public static void main(String[] args) throws IOException {
System.out.println("Creating Database TestObj on ObjectDb");
try
{
javax.persistence.EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("TestObjPU");
@SuppressWarnings("unused")
javax.persistence.EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Container container = Container.getInstance(em);
container.generateMapItems(1, em);
em.getTransaction().commit();
System.out.println("Created Database");
}
catch(Throwable t)
{
System.out.println("Problem Creating Database");
t.printStackTrace(System.out);
}
}