Hi all,
I've been experiencing few problems with Identity class and Parent/Children
entity relationship. I tried with both OpenJPA 1.2.1 and 2.0.0-SNAPSHOT. I have
a very simple test case which can briefly explain problems:
@Entity
public class Parent implements Serializable {
private long id;
....
private List<Child> children = new LinkedList<Child>();
@Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, insertable = false, updatable = false,
nullable = false)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
public List<Child> getChildren() {
return children;
}
public void addChild(Child child) {
if (child == null) {
throw new IllegalArgumentException("Cannot add a null Child");
}
this.getChildren().add(child);
}
public void setChildren(List<Child> children) {
this.children = children;
}
}
@Entity
@IdClass(ChildId.class)
public class Child implements Serializable {
private long id;
...
private Parent parent;
@Id
@Column(name = "id", unique = false, nullable = false)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
...
@Id
@ManyToOne
@JoinColumn(name = "parent_id", referencedColumnName = "id")
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
ChidId is generated with the Application Identity Tool:
public class ChildId implements Serializable {
...
public long id;
public long parent;
...
}
1) Merge operation fail in any case with following exception:
java.lang.NullPointerException
at net.company.persistence.Child.pcCopyKeyFieldsFromObjectId(Child.java)
at net.company.persistence.Child.pcNewInstance(Child.java)
at org.apache.openjpa.kernel.AttachStrategy.persist(AttachStrategy.java:93)
at
org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:100)
at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:241)
at
org.apache.openjpa.kernel.AttachStrategy.attachCollection(AttachStrategy.java:333)
at
org.apache.openjpa.kernel.AttachStrategy.replaceList(AttachStrategy.java:359)
at
org.apache.openjpa.kernel.AttachStrategy.attachField(AttachStrategy.java:223)
at
org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:153)
at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:241)
at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:101)
at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3212)
... 25 more
The problem is caused by the call pc.NewInstance(AttachStrategy:93) with null
state manager instance which is used in pcCopyKeyFieldsFromObjectId(..):
pcsetParent((Parent)pcStateManager.getPCPrimaryKey(childid, 2 +
pcInheritedFieldCount));
Also, for same problem exists JIRA Issue:
https://issues.apache.org/jira/browse/OPENJPA-218
2) Persist working fine, but it's fail in the case when Parent.id is Generated
Value field with following exception:
<openjpa-1.2.1-r752877:753278 fatal user error>
org.apache.openjpa.persistence.InvalidStateException: Detected reentrant flush.
Make sure your flush-time instance callback methods or event listeners do not
invoke any operations that require the in-progress flush to complete.
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1904)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1679)
at
org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:524)
at
org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:506)
at
org.apache.openjpa.kernel.StateManagerImpl.fetchObjectId(StateManagerImpl.java:1434)
at net.company.persistence.Parent.pcFetchObjectId(Parent.java)
at net.company.persistence.Child.pcCopyKeyFieldsToObjectId(Child.java)
Does exists some workaround for these problems ?
Regards,
Nemanja J.
--
View this message in context:
http://n2.nabble.com/Identity-class-and-parent-children-entity-relationship-tp2552430p2552430.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.