我做错了什么或JPA2 / eclipselink不支持,让我按代码解释一下;
@Embeddable
public class MemberID implements Serializable {
private String e_mail;
private String password;
//...no-arg constructor, getter and setter
下面的实体使用MemberID作为复合键
@Entity
@Table(name="MEMBER_DETAILS")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="GROUPNAME", discriminatorType=DiscriminatorType.STRING, length=20)
public class Member_Details implements Serializable {
@EmbeddedId
private MemberID memberIdentity;
...other code
下面的实体扩展了Member_Details,因此继承了它的密钥
@Entity
@Table(name="INDIVIDUAL_USER")
@DiscriminatorValue("INDIVIDUAL_USER")
public class Individual_User extends Member_Details implements Serializable {
@OneToMany(mappedBy="userinfo", fetch=FetchType.EAGER)
private List<UserComment> userComments = new ArrayList<UserComment>();
... other code
以下是包含MemberID作为其一部分的复合键。
@Embeddable
public class CommentID implements Serializable {
private MemberID memberId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="TIME_POSTED")
private Date timeOfComment;
...other code
下面的实体使用CommentID作为其复合键。我希望它依赖于实体Individual_User,因此使用派生id。这就是为什么MemberID是其复合键的一部分。
@Entity
@Table(name="USER_COMMENTS")
public class UserComment implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private CommentID commentIdentity;
@MapsId("memberId")
@ManyToOne
@JoinColumns({
@JoinColumn(name="E_MAIL", referencedColumnName="E_MAIL"),
@JoinColumn(name="PASSWORD", referencedColumnName="PASSWORD")
})
private Individual_User userinfo;
...other code
当我尝试部署时出现问题,抛出以下异常:
Caused by: Exception [EclipseLink-7321] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The field [MEMBER_DETAILS.PASSWORD] from the derived id mapping [userinfo] from class [kariro.semaplace.talk.entities.UserComment] is an invalid id field from the reference class [kariro.semaplace.registration.entity.Individual_User]. Ensure there is a corresponding id mapping to that field.
但是,当我将@ManyToOne关系从UserComment更改为reffer以键入Member_Details而不是其子类型Individual_User时,它没有任何问题,但我担心这会在以后引入更多问题,或者会影响应用程序的运行。 我真的不知道eclipselink是否不允许将继承的id用作派生ID或者做错了什么。有人请帮帮我。
答案 0 :(得分:0)
我不确定您收到错误的原因,但您可以通过简化实体来完全避免此问题。
向我跳出的第一件事是你的用户的PK包括password
。密码通常是可更改的,主键则不是。此外,您是否希望有两个不同的用户使用相同的电子邮件但密码不同?可能不是。删除MemberID
并更改Member_Details
,只需@Id
只有e_mail
:
@Entity
@Table(name="MEMBER_DETAILS")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="GROUPNAME", discriminatorType=DiscriminatorType.STRING, length=20)
public class Member_Details implements Serializable
{
@Id
private String e_mail;
private String password;
// ...
}
CommentID
也会改变:
@Embeddable
public class CommentID implements Serializable
{
private String e_mail;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="TIME_POSTED")
private Date timeOfComment;
}
@MapsId
上的UserComment
会更改为@MapsId("e_mail")
。
上述更改应足以避免您的问题,但如果是我,我也会删除UserComment
上的复合主键。简而言之,您可以给它UUID
,然后在e_mail
和timeOfComment
上添加一个唯一约束。