openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Dick <michael.d.d...@gmail.com>
Subject Re: inverse OneToMany relation - getting weird
Date Fri, 13 Nov 2009 17:27:00 GMT
Hi Marc,

Are you setting the relationship for both the Father and Child entities?

I see the behavior you describe if I do this :
        Father f;
        Child c;
        for (int i = 0; i < nFathers; i++) {
            f = new Father();
            f.setChildren(new ArrayList<Child>());
            em.persist(f);

            for(int j = 0 ; j < nChildren; j++ ) {
                c = new Child();
//                c.setFather(f);
                f.getChildren().add(c);
                em.persist(c);
            }


Uncommenting c.setFather(f); fixes the problem. If that doesn't help let me
know which version of OpenJPA and which database you're using and I'll try
to recreate.

-mike

On Fri, Nov 13, 2009 at 10:33 AM, Marc Logemann <li@logemann.org> wrote:

> Hi,
>
> what you have done works of course but thats not my problem because thats
> what i had before i wanted to do the inverse. Your example simply
> demonstrates how to use ElementJoinColumn and i am pretty aware of that ;-)
> The problem starts when using mappedBy on the children inside Father.
>
> When i am doing it as you described it in your email before, i am at least
> not getting any errors back but instead he inserts a "null" in my FK field.
>
>    @ManyToOne
>    @ForeignKey
>    @JoinColumn(name="team_oid", referencedColumnName="oid")
>    public Team team;
>
> I am really clueless. It simply cant be so hard and uncommon to make an
> inverse OneToMany with a FK field in the child table.
>
> I googled for hours and all example i ve found just dont work.
>
>
>
> ---
> regards
> Marc Logemann
> http://www.logemann.org
> http://www.logentis.de
>
>
>
>
> Am 13.11.2009 um 17:17 schrieb Michael Dick:
>
>
>  Hi Marc,
>>
>> Did some more reading and I was wrong about the use case for the @Element
>> annotations. The @Element annotations allow you to specify the FK
>> constraint
>> on the One side of a @OneToMany, so your annotations would look like this
>> :
>>
>> @Entity
>> public class Father extends Person {
>>   @OneToMany
>>   @ElementForeignKey
>>   @ElementJoinColumn(name="father_oid", referencedColumnName="oid")
>>   Collection<Child> children;
>> . . .
>> }
>>
>> @Entity
>> public class Child extends Person {
>>   @ManyToOne
>>   private Father father;
>> . . .
>> }
>>
>> It appears to be functionally identical to using @JoinColumn and
>> @ForeignKey
>> on the Child class, but the documentation is a bit sparse on this
>> annotation..
>>
>> There are several examples in our unit tests though. For example
>>
>> openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/mapping/bidi/ParentWithAutoIdentity.java
>> looks somewhat similar to your model.
>>
>> Hope this helps,
>> -mike
>>
>>
>> ---------- Forwarded message ----------
>> From: Michael Dick <michael.d.dick@gmail.com>
>> Date: Fri, Nov 13, 2009 at 9:52 AM
>> Subject: Re: inverse OneToMany relation - getting weird
>> To: users@openjpa.apache.org
>>
>>
>> Hi Marc,
>>
>> I think the @ElementForeignKey and @ElementJoinColumn annotations are
>> intended to be used with non-entity types (ie PersistentCollections).
>>
>> If Child is an entity you'd want to use @ForeignKey and @JoinColumn
>> instead
>> (I gave this a quick try and it looks like it worked for me).
>>
>> Regards,
>> -mike
>>
>>
>> On Fri, Nov 13, 2009 at 7:03 AM, Marc Logemann <li@logemann.org> wrote:
>>
>>  Hi,
>>>
>>> after struggling for several hours, i need to ask for help.
>>>
>>> Following scenario.....
>>>
>>> DB Table: Father
>>> ---------------------------
>>> INT oid
>>> ....
>>>
>>>
>>> DB Table: Childs
>>> ------------------------
>>> INT oid
>>> INT father_oid
>>> ...
>>>
>>> Java Entity: Father
>>> --------------------------
>>> ...
>>> @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "father")
>>> private List<Child> childList;
>>>
>>> Java Entity: Child
>>> --------------------------
>>> ...
>>> @ManyToOne(cascade = CascadeType.PERSIST)
>>> @ElementForeignKey
>>> @ElementJoinColumn(name="father_oid", referencedColumnName="oid")
>>> protected Father father;
>>>
>>>
>>> When i try to persist a Father, i am getting:
>>>
>>> <openjpa-1.2.0-r422266:683325 fatal user error>
>>> org.apache.openjpa.persistence.ArgumentException: Field
>>> "Father.childList"
>>> declares "Child.father" as its mapped-by field, but this field is not a
>>> direct relation. at......
>>>
>>> Ok, then i changed Child to:
>>>
>>> Java Entity: Child
>>> --------------------------
>>> ...
>>> @ManyToOne(cascade = CascadeType.PERSIST)
>>> @Column(name = "father_oid")
>>> protected Father father;
>>>
>>>
>>> When i now do persist a Father object, both DB records (Father and
>>> Childs)
>>> are filled with records but the FK column in Child (father_oid) is empty.
>>> So
>>> the FK relation is broken but it did persist childs, which is somehow
>>> weird.
>>>
>>> So whatever i do, i never get a fully persisted graph with correct FK
>>> values.
>>>
>>> Can anyone give me a hint what i am doing wrong here?
>>>
>>>
>>> Thanks a lot.
>>>
>>> ---
>>> regards
>>> Marc Logemann
>>> http://www.logemann.org
>>> http://www.logentis.de
>>>
>>>
>>>
>>>
>>>
>>>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message