วิธีสร้างและจัดการคีย์หลักแบบผสมใน JPA


108

ฉันต้องการมีเวอร์ชันจากการป้อนข้อมูลเดียวกัน กล่าวอีกนัยหนึ่งคือฉันต้องการทำรายการซ้ำกับหมายเลขเวอร์ชันอื่น

id - Version จะเป็นคีย์หลัก

นิติบุคคลควรมีลักษณะอย่างไร? ฉันจะทำซ้ำกับเวอร์ชันอื่นได้อย่างไร

id Version ColumnA

1   0      Some data
1   1      Some Other data
2   0      Data 2. Entry
2   1      Data

เมื่อใช้@IdClassคำอธิบายประกอบคำแนะนำอีกประการหนึ่งที่ฉันพบคือ@Columnคำอธิบายประกอบควรเข้าไปในฟิลด์ของคลาสเอนทิตี ( YourEntityในโค้ดตัวอย่างของ RohitJan)
KenSV

คำตอบ:


231

คุณสามารถสร้างEmbedded classซึ่งมีสองคีย์ของคุณจากนั้นมีการอ้างอิงถึงคลาสนั้นเช่นเดียวกับEmbeddedIdในEntityไฟล์.

คุณจะต้องมีคำอธิบายประกอบ@EmbeddedIdและ@Embeddable

@Entity
public class YourEntity {
    @EmbeddedId
    private MyKey myKey;

    @Column(name = "ColumnA")
    private String columnA;

    /** Your getters and setters **/
}
@Embeddable
public class MyKey implements Serializable {

    @Column(name = "Id", nullable = false)
    private int id;

    @Column(name = "Version", nullable = false)
    private int version;

    /** getters and setters **/
}

วิธีการที่จะประสบความสำเร็จในงานนี้ก็คือการใช้@IdClassคำอธิบายประกอบและสถานที่ของคุณทั้งสองในการที่id IdClassตอนนี้คุณสามารถใช้@Idคำอธิบายประกอบปกติกับทั้งสองแอตทริบิวต์

@Entity
@IdClass(MyKey.class)
public class YourEntity {
   @Id
   private int id;
   @Id
   private int version;

}

public class MyKey implements Serializable {
   private int id;
   private int version;
}

4
เป็นไปได้ไหมที่จะใช้@Generatedvalueสำหรับ Id โดย EmbeddedId
Kayser

1
@Kayser. เท่าที่ฉันรู้. ไม่ได้คุณต้องตั้งค่าให้ชัดเจนในอินสแตนซ์ KeyClass ของคุณจากนั้นตั้งค่าอินสแตนซ์คลาสคีย์นั้นในเอนทิตีของคุณ
Rohit Jain

@Kayser. @GeneratedValueสามารถใช้เพื่อสร้างค่าคีย์สำหรับคีย์หลักเท่านั้นไม่สามารถสร้างชุดค่าผสมสำหรับคีย์ผสมได้
Rohit Jain

1
@RohitJain เพียงสิ่งเดียว: คุณไม่สามารถทำให้คลาสฝังตัวเป็นสาธารณะได้ (ต้องอยู่ในไฟล์ของตัวเองเพื่อให้เป็นสาธารณะ)
Lucas

1
@FastEngy มันยังสามารถเข้าถึงได้ผ่านทาง Wayback เครื่อง: web.archive.org/web/20170123035517/http://uaihebert.com/... ดูเหมือนว่าบทความนี้จะถูกแทนที่โดยweb.archive.org/web/20170202203555/http://uaihebert.com/…และweb.archive.org/web/20161014051056/http://uaihebert.com/…ซึ่งหายไปเช่นกัน …
radlan


5

ระดับคีย์:

@Embeddable
@Access (AccessType.FIELD)
public class EntryKey implements Serializable {

    public EntryKey() {
    }

    public EntryKey(final Long id, final Long version) {
        this.id = id;
        this.version = version;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getVersion() {
        return this.version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public boolean equals(Object other) {
        if (this == other)
            return true;
        if (!(other instanceof EntryKey))
            return false;
        EntryKey castOther = (EntryKey) other;
        return id.equals(castOther.id) && version.equals(castOther.version);
    }

    public int hashCode() {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + this.id.hashCode();
        hash = hash * prime + this.version.hashCode();
        return hash;
    }

    @Column (name = "ID")
    private Long id;
    @Column (name = "VERSION")
    private Long operatorId;
}

คลาสเอนทิตี:

@Entity
@Table (name = "YOUR_TABLE_NAME")
public class Entry implements Serializable {

    @EmbeddedId
    public EntryKey getKey() {
        return this.key;
    }

    public void setKey(EntryKey id) {
        this.id = id;
    }

    ...

    private EntryKey key;
    ...
}

ฉันจะทำซ้ำกับเวอร์ชันอื่นได้อย่างไร

คุณสามารถแยกเอนทิตีที่ดึงมาจากผู้ให้บริการเปลี่ยนคีย์ของรายการจากนั้นคงอยู่เป็นเอนทิตีใหม่


ist มันเป็นไปได้ในการกำหนดรหัสใน AUTOGENERATEDEntrykey อะไรทำนองนั้น @GeneratedValue(strategy = GenerationType.IDENTITY)
Kayser

1
ฉันยังสงสัยว่าจะคำนวณแฮชสำหรับคีย์หลักแบบยาว 2 คีย์ได้อย่างไร ในฐานะที่เป็นhashและprimeวิธีการhashCodeในชั้นเรียนEntryKeyคุณสามารถบอกฉันที่คิดว่ามาจากไหน
Bruce Sun

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.