Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Entity relationship issue

Khaskett, Tim,
   My understanding of the mappedBy attribute is that only one (the inverse non-owning) side of a bidirectional relationship specifies the field on the owner of the relationship.
   Therefore the older version where there is a mappedBy only on the @OneToMany is correct (as long as CpMsg is the owner).

    These should be correct (without a mappedBy on the ManyToOne).


    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cpUser")

    @ManyToOne(fetch = FetchType.LAZY)


   To verify this I checked the EJB 3.0 persistence specification.  See section 2.1.7 "Entity Relationships". There are two clauses...
    "The inverse side of a bidirectional relationship must refer to its owning side by use of the mappedBy element of the OneToOne, OneToMany or ManyToMany annotation". - Tim thank you for suggesting the mappedBy attribute.
     But, I noticed that the qualifying phrase left of ManyToOne.
     In the 2nd point it states that in the case of a 1-m and m-1 relationship that "the mappedBy element cannot be specified by the ManyToOne annotation.

     So it looks like the ManyToOne in the case must always be the owning side of the relationship - forcing only the OneToMany to have the mappedBy attribute.  In my own experiments with JPA I was only able to move the single owner around in a ManyToMany relationship. 
      See also the JEE5 tutorial that restates these two points about a single mappedBy and the "many side of a many-to-one" is not the owner under "Bidirectional Relationships".

http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqa.html


      Note 1: I suspect that your JoinColumn attribute may be causing conflict problems with the mappedBy attribute  - try removing JoinColumn or using "name" instead of "referencedColumnName" within it - I think we will pick it up.  I might be missing something but the ID and the JoinColumn names are different.

      Note 2: verify you want lazy loading on both sides of the relationship - I need to find out which 4 combinations are valid.

    Thank you
    /michael

----------Original Message----------

From: "Tim Hollosy" <hollosyt@xxxxxxxxx>
Sent: Wed, December 03, 2008 6:05 AM
To: "EclipseLink User Discussions" <eclipselink-users@xxxxxxxxxxx>
Subject: Re: [eclipselink-users] Entity relationship issue


You forgot the mappedBy attribute in your @ManyToOne annotation it
should be @ManyToOne(fetch = FetchType.LAZY,mappedBy="messages")

You might try to generate your Entities using the Dali JPA Tools in
Eclipse to see the proper way to do these mappings.

./tch



On Tue, Dec 2, 2008 at 11:59 PM, khaskett <khaskett@xxxxxxxxxxx> wrote:
>
> I added the @ManyToOne and i still get the same error -
>
> public class CpUser extends BaseDomain {
> ....
>    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy =
> "cpUser")
>    @JoinColumn(referencedColumnName = "USER_ID")
>    public Set<CpMsg> getMessages() {
>        return messages;
>    }
>
> public class CpMsg extends BaseDomain {
> ....
>    @ManyToOne(fetch = FetchType.LAZY)
>        public CpUser getCpUser() {
>                return this.cpUser;
>        }
>
> Thanks for the reply.
>
>
> Tim Hollosy wrote:
>>
>> It doesn't look like your relationship is defined in both entities. In
>> JPA you always need to make sure you do this. You need to have the
>> @ManyToOne annotation back in your CpMsg entity.
>>
>> Check: http://en.wikibooks.org/wiki/Java_Persistence/OneToMany
>>
>> for more info.
>> ./tch
>>
>>
>>
>> On Tue, Dec 2, 2008 at 6:20 PM, khaskett <khaskett@xxxxxxxxxxx> wrote:
>>>
>>> I am having an issue with creating a relationship between 2 entities,
>>> where
>>> the parent entity was created from a Stored Procedure. When I try to use
>>> the
>>> @OneToMany annotation it tries to join the two entities.
>>>
>>> @Entity
>>> public class CpUser extends BaseDomain {
>>>
>>>    // Attributes
>>>    @Id
>>>    @Column(name = "paramUserID")
>>>    private String userId;
>>>
>>>    @Column(name = "paramInitials")
>>>    private String initials;
>>>
>>>    @Column(name = "paramFirstName")
>>>    private String firstName;
>>>
>>>    @Column(name = "paramLastName")
>>>    private String lastName;
>>>
>>>     .....
>>>
>>>    /*
>>>     * List of user messages
>>>     */
>>>    private Set<CpMsg> messages = new HashSet<CpMsg>(0);
>>>
>>>   .....
>>>    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy
>>> =
>>> "userId")
>>>    public Set<CpMsg> getMessages() {
>>>        return messages;
>>>    }
>>> }  // End CpUser
>>>
>>> @Entity
>>> @Table(name = "CP_MSG")
>>> public class CpMsg extends BaseDomain {
>>>
>>>        // Fields
>>>        @Id
>>>        @GeneratedValue(strategy = GenerationType.IDENTITY)
>>>        @Column(name = "MSG_ID", unique = true, nullable = false,
>>> precision = 11,
>>> scale = 0)
>>>        private Long msgId;
>>>        @Column(name = "MSG_TEXT", nullable = false)
>>>        private String msgText;
>>>
>>>        private CpUser cpUser;
>>>    ....
>>>        public CpUser getCpUser() {
>>>                return this.cpUser;
>>>        }
>>> } //End CpMsg
>>>
>>> I removed some fields for brevity.
>>> When I try and get the messages for that user by calling getMessages() I
>>> get
>>> this in the logs -
>>> Call: SELECT t1.MSG_ID, t1.MSG_TEXT, t1.USER_ID FROM CPUSER_CP_MSG t0,
>>> CP_MSG t1 WHERE ((t0.CpUser_paramUserID = ?) AND (t1.MSG_ID =
>>> t0.messages_MSG_ID))
>>>        bind => [USER123]
>>>
>>> And the error is that CPUSER_CP_MSG doesnt exist, which is correct.
>>>
>>> I guess I assumed it would just do a select on the child table passing in
>>> the value from the parent.
>>>
>>> Thanks in advance
>>>
>>> --
>>> View this message in context:
>>> http://www.nabble.com/Entity-relationship-issue-tp20803337p20803337.html
>>> Sent from the EclipseLink - Users mailing list archive at Nabble.com.
>>>
>>> _______________________________________________
>>> eclipselink-users mailing list
>>> eclipselink-users@xxxxxxxxxxx
>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>>
>> _______________________________________________
>> eclipselink-users mailing list
>> eclipselink-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>
>>
>
> --
> View this message in context: http://www.nabble.com/Entity-relationship-issue-tp20803337p20806849.html
> Sent from the EclipseLink - Users mailing list archive at Nabble.com.
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users


Back to the top