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.

Reply via email to