[
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