Hello!
When the JPA entities are not enhanced the removal of an entry from a @OneToMany collection is not possible. The following java code demonstrates the problem. The statement
parentEntity.getChildEntityContainer().remove("01");
does not work correctly with not enhanced JPA entities.
package objectdb.examples;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Persistence;
import org.junit.Assert;
public final class ChildEntityRemoveProblem {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("objectdb:$objectdb/db/test.tmp;drop");
EntityManager entityManager = emf.createEntityManager();
ParentEntity parentEntity = new ParentEntity();
entityManager.getTransaction().begin();
entityManager.persist(parentEntity);
entityManager.getTransaction().commit();
entityManager.getTransaction().begin();
ChildEntity childEntity = new ChildEntity();
childEntity.setStringAttribute1("abc");
parentEntity.getChildEntityContainer().put("01", childEntity);
entityManager.flush();
entityManager.remove(parentEntity.getChildEntityContainer().get("01"));
parentEntity.getChildEntityContainer().remove("01");
entityManager.flush();
entityManager.getTransaction().commit();
entityManager.clear();
parentEntity = entityManager.find(ParentEntity.class, 1l);
Assert.assertEquals(0, parentEntity.getChildEntityContainer().size());
entityManager.close();
emf.close();
}
@Entity
public static class ChildEntity {
@Column
private String stringAttribute1;
public String getStringAttribute1() {
return stringAttribute1;
}
public void setStringAttribute1(String stringAttribute1) {
this.stringAttribute1 = stringAttribute1;
}
}
@Entity
public static class ParentEntity {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Map<String, ChildEntity> childEntityContainer = new HashMap<String, ChildEntityRemoveProblem.ChildEntity>();
public Map<String, ChildEntity> getChildEntityContainer() {
return childEntityContainer;
}
}
}