1

私は何か間違ったことをしていますか、それともこれは 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 から、そのサブタイプ Individual_User ではなくタイプ Member_Details を参照するように変更すると、問題なく動作しますが、後でさらに問題が発生したり、アプリの機能が損なわれたりするのではないかと心配しています。eclipselink が継承された ID を派生 ID として使用することを許可していないのか、何か間違ったことをしているのか、私には本当にわかりません。誰か私を助けてください。

4

1 に答える 1