package setandremoveissue; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.FlushModeType; import javax.persistence.Id; import javax.persistence.Persistence; import javax.persistence.Transient; import javax.persistence.TypedQuery; public class SetAndRemoveIssue { private static final String VECTOR_ID = "v-id"; private static final long STEP_NUMBER = 0L; public static void main(String[] args) { EntityManagerFactory emf = Persistence .createEntityManagerFactory("objectdb:$objectdb/db/test.tmp;drop"); EntityManager em = emf.createEntityManager(); em.setFlushMode(FlushModeType.COMMIT); em.getTransaction().begin(); TCStep a = new TCStepImpl(VECTOR_ID, STEP_NUMBER); a = em.merge(a); em.getTransaction().commit(); em.close(); em = emf.createEntityManager(); em.getTransaction().begin(); a = findStepBefore(VECTOR_ID, STEP_NUMBER + 1, em); a.setStepDuration(2); a = findStepWithStepNumber(VECTOR_ID, STEP_NUMBER, em); em.remove(a); em.getTransaction().commit(); em.close(); emf.close(); System.out.println("ok"); } public static TCStep findStepBefore(String vectorID, long stepNumber, EntityManager em) { String sql = "SELECT s FROM " + TCStepImpl.class.getSimpleName() + " s WHERE s.vectorID == ?1 AND s.stepNumber < ?2 ORDER BY s.stepNumber DESC"; TypedQuery query = em.createQuery(sql, TCStepImpl.class); query.setParameter(1, vectorID); query.setParameter(2, stepNumber); List stepList = query.getResultList(); if (stepList != null && !stepList.isEmpty()) { return stepList.get(0); } return null; } public static TCStep findStepWithStepNumber(String vectorID, long stepNumber, EntityManager em) { String sql = "SELECT s FROM " + TCStepImpl.class.getSimpleName() + " s WHERE s.vectorID == ?1 AND s.stepNumber == ?2"; TypedQuery query = em.createQuery(sql, TCStepImpl.class); query.setParameter(1, vectorID); query.setParameter(2, stepNumber); List stepList = query.getResultList(); if (stepList != null && !stepList.isEmpty()) { return stepList.get(0); } return null; } public static interface ModelElement { public String getURI(); public String getUid(); @Override public boolean equals(Object obj); @Override public int hashCode(); } @Entity @Access (AccessType.FIELD) public static abstract class ModelElementImpl implements ModelElement { @Transient private String uidTemp; protected static AtomicLong uidCounter = new AtomicLong(0); protected ModelElementImpl() { } @Id @Access (AccessType.PROPERTY) @Column (name = "uid") @Override public String getUid() { if (this.uidTemp == null) { long id = uidCounter.incrementAndGet(); this.uidTemp = "" + id; } return this.uidTemp; } @Deprecated protected void setUid(String uid) { if (this.uidTemp != null && !this.uidTemp.equals(uid)) { throw new IllegalStateException("Attempt to set the UID of a ModelElement to a different ID value."); } this.uidTemp = uid; } @Override public int hashCode() { return getUid().hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof ModelElement) { return this.getUid().equals(((ModelElement)obj).getUid()); } return super.equals(obj); } @Override public String getURI() { throw new UnsupportedOperationException(); } } public static interface TCStep extends ModelElement { public long getStepNumber(); public void setStepNumber(long stepNumber); public String getComment(); public void setComment(String comment); public long getStepDuration(); public void setStepDuration(long stepDuration); public String getVectorID(); public void setVectorID(String vectorID); } @Entity @Access (AccessType.FIELD) public static class TCStepImpl extends ModelElementImpl implements TCStep { @Basic private long stepNumber; @Basic private String comment; @Basic private long stepDuration; @Basic private String vectorID; public TCStepImpl(String vectorID, long stepNumber) { this.vectorID = vectorID; this.stepNumber = stepNumber; this.stepDuration = 1; } @Override public long getStepNumber() { return stepNumber; } @Override public void setStepNumber(long stepNumber) { this.stepNumber = stepNumber; } @Override public String getComment() { return comment; } @Override public void setComment(String comment) { this.comment = comment; } @Override public long getStepDuration() { return stepDuration; } @Override public void setStepDuration(long stepDuration) { this.stepDuration = stepDuration; } @Override public String getVectorID() { return vectorID; } @Override public void setVectorID(String vectorID) { this.vectorID = vectorID; } } }