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,

Your JoinColumn is being specified on the wrong side of the relationship. It should be specified on the ManyToOne and not on the OneToMany in this case since it is the non-owning side (as specified by the mappedBy value).

Cheers,
Guy

----- Original Message ----- From: "Michael O'Brien" <michael.obrien@xxxxxxxxxx> To: "EclipseLink User Discussions" <eclipselink-users@xxxxxxxxxxx>; "EclipseLink User Discussions" <eclipselink-users@xxxxxxxxxxx>
Sent: Wednesday, December 03, 2008 7:59 AM
Subject: 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
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top