2012-10-23 30 views
71

Tôi muốn có các phiên bản từ cùng một mục nhập dữ liệu. Nói cách khác, tôi muốn sao chép mục nhập với một số phiên bản khác.Cách tạo và xử lý khóa chính kết hợp trong JPA

id - Version sẽ là khóa chính.

Thực thể trông như thế nào? Làm thế nào tôi có thể sao chép nó với một phiên bản khác?

id Version ColumnA 

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

Trả lời

158

Bạn có thể thực hiện một Embedded class, trong đó có hai phím của bạn, và sau đó có một tham chiếu đến lớp đó như EmbeddedId trong Entity của bạn.

Bạn sẽ cần chú thích @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 **/ 
} 

Một cách khác để đạt được nhiệm vụ này là sử dụng @IdClass chú thích, và để cả hai bạn id trong IdClass đó. Bây giờ bạn có thể sử dụng bình thường @Id chú thích trên cả các thuộc tính

@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; 
} 
+0

Có thể sử dụng '@ Generatedvalue' cho Id của EmbeddedId – Kayser

+1

@Kayser không. Theo như tôi biết. Không. Bạn phải đặt giá trị cho chúng trong cá thể KeyClass của bạn một cách rõ ràng, và sau đó thiết lập cá thể lớp khóa đó trong thực thể của bạn. –

+0

@Kayser. '@ GeneratedValue' chỉ có thể được sử dụng để tạo ra các giá trị khóa cho khóa chính, nó không thể tạo kết hợp cho các phím tổng hợp. –

2

lớp chính:

@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 lớp:

@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; 
    ... 
} 

Làm thế nào tôi có thể sao chép nó với phiên bản khác?

Bạn có thể tách thực thể được truy xuất từ ​​nhà cung cấp, thay đổi khóa Nhập và sau đó tiếp tục là đối tượng mới.

+0

Tôi có thể xác định id trong khóa nhập 'AUTOGENERATED'. oder một cái gì đó như thế '@GeneratedValue (strategy = GenerationType.IDENTITY)' – Kayser

+1

Tôi cũng tự hỏi làm thế nào để tính toán băm cho 2 khóa chính dài. Đối với 'hash' và' prime' trong phương thức 'hashCode' trong lớp' EntryKey', bạn có thể cho tôi biết ý tưởng đó đến từ đâu không? –

4

Lớp MyKey phải thực hiện Serializable nếu bạn đang sử dụng @IdClass

0

Lớp MyKey (@Embeddable) không nên có bất kỳ mối quan hệ như @ManyToOne

-1

Khi sử dụng @IdClass chú thích, một mũi tôi thấy là Chú thích @Column phải đi vào các trường của lớp Thực thể (YourEntity trong mã mẫu của RohitJan).

Các vấn đề liên quan