1

休止状態を使用して複合キーの作成に取り組んでいます。このリンクを見つけました: 複合主キーの作成方法 (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 クラスのテーブルはまだ作成されていません。私を助けてください。

4

2 に答える 2

0

これは、たとえばフィールド名が単なるサンプルの場合の解決策だと思います:

@Id
@Column(name = "EMP_NO_FK" , unique=true , nullable = false ,length=10)
private Long empno;

@Id
@Column(name = "GROUP_NO_FK" , unique=true , nullable = false ,length=5)
private Long  groupNo;

@Id
@Column(name = "DEPT_NO_FK" , unique=true , nullable = false ,length=10)
private Long deptno;

@Id
@Column(name = "YEAR_NAME_M_FK" , unique=true , nullable = false ,length=4)
private Integer  year;
于 2013-04-14T11:01:14.473 に答える