休止状態を使用して複合キーの作成に取り組んでいます。このリンクを見つけました: 複合主キーの作成方法 (Java 永続性注釈)
まず最初に、Tim が受け入れた解決策を で試しました@NaturalId
。私にはうまくいきませんでした。
次に、Arthur Ronald FD Garcia のソリューションを試しました。私はまだそれでいくつかの問題を抱えています。Arthur Ronald FD Garcia のソリューションに非常によく似た私のコードを次に示します。
メールボックス クラス:
@Entity
public class Mailbox {
@Id
@GeneratedValue
private int mailboxId;
@Column( unique=true, nullable=false )
private String name;
@Column( unique=true, nullable=false )
private String employeeId;
private String status;
private Date createdOn;
@OneToMany(cascade=CascadeType.ALL, mappedBy="joinedMailboxMessageId.mailboxId")
private List<MailboxMessages> joinedMailboxMessageList = new ArrayList<MailboxMessages>();
public Mailbox(){}
public Mailbox(int id) {this.mailboxId=id;}
public void addSMail(SMail mail) {
// Implementation
}
//Getters and setters
}
SMail クラス
@Entity
public class SMail {
@Id
@GeneratedValue
private int messageId;
private Date originDate;
private String from;
@ElementCollection
private List<String> to=new ArrayList<String>();
@Lob
private String message;
private String subject;
@OneToMany(cascade=CascadeType.ALL, mappedBy="joinedMailboxMessageId.messageId")
private List<MailboxMessages> joinedMailboxMessageList = new ArrayList<MailboxMessages>();
public SMail() {}
public SMail(int messageId) {
this.messageId=messageId;
}
// addMailbox sets up bidirectional relationship
public void addMailbox(Mailbox mailbox) { // Implementation}
//Getters and setters
}
最後に私の MailboxMessages クラス
@Entity
public class MailboxMessages {
@ManyToOne
@JoinColumn(name="MAILBOX_ID", insertable=false, updatable=false)
private Mailbox mailboxId;
@ManyToOne
@JoinColumn(name="MESSAGE_ID", insertable=false, updatable=false)
private SMail messageId;
private boolean read;
private boolean deleted;
private boolean flagged;
private String priority;
private Date messageDate;
@EmbeddedId
// Implemented as static class - see bellow
private MailboxMessagesId joinedMailboxMessageId;
// INNER CLASS: required because this class contains composite id
@Embeddable
public static class MailboxMessagesId implements Serializable {
@ManyToOne
@JoinColumn(name="MAILBOX_ID")
private Mailbox mailboxId;
@ManyToOne
@JoinColumn(name="MESSAGE_ID")
private SMail messageId;
// required no arg constructor
public MailboxMessagesId() {}
public MailboxMessagesId(Mailbox mailbox, SMail mail) {
this.mailboxId = mailbox;
this.messageId = mail;
}
public MailboxMessagesId(int mailboxId, int messageId) {
this(new Mailbox(mailboxId), new SMail(messageId));
}
@Override
public boolean equals(Object instance) {
if (instance == null)
return false;
if (!(instance instanceof MailboxMessagesId))
return false;
final MailboxMessagesId other = (MailboxMessagesId) instance;
if (!(mailboxId.getMailboxId()==(other.getMailboxId().getMailboxId())))
return false;
if (!(messageId.getMessageId()==(other.getMessageId().getMessageId())))
return false;
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 47 * hash + (this.mailboxId != null ? this.mailboxId.hashCode() : 0);
hash = 47 * hash + (this.messageId != null ? this.messageId.hashCode() : 0);
return hash;
}
//Getters and setters
}
//Constructors and getters and setters
}
本当の問題は、休止状態がメールボックス クラスのテーブルのみを作成していることです。したがって、問題は他の2つのクラスにあると思います。Arthur Ronald の正確な解法を試しました。そしてそれは完璧に機能しました。コードで犯している可能性のある間違いを特定するのを手伝ってくれませんか。また、MailboxMessage クラスで複合キーを作成するためのこの手法に代わるものがある場合
EDIT1:
見つかった問題の 1 つは、SQL の予約済みキーワードであるメンバー フィールドとして「from」を使用していたことです。誰がそれを考えたでしょうか?しかし、問題はまだ解決していません。現在、smail クラスのテーブルはありますが、MailboxMessages クラスのテーブルはまだ作成されていません。私を助けてください。