2008-09-18 38 views
8

Tôi muốn tạo một thực thể có khóa chính được tạo tự động, nhưng cũng là một khóa hợp chất duy nhất được tạo thành từ hai trường khác. Làm thế nào để làm điều này trong JPA?
Tôi muốn làm điều này bởi vì khóa chính nên được sử dụng như khóa ngoài trong một bảng khác và làm cho nó hợp chất sẽ không được tốt.Các phím tổng hợp trong JPA

Trong đoạn mã sau, tôi cần lệnh và mô hình là duy nhất. pk dĩ nhiên là khóa chính.

@Entity 
@Table(name = "dm_action_plan") 
public class ActionPlan { 
    @Id 
    private int pk; 
    @Column(name = "command", nullable = false) 
    private String command; 
    @Column(name = "model", nullable = false) 
    String model; 
} 
+0

vấn đề với việc sử dụng một chìa khóa hợp chất như một chìa khóa nước ngoài là gì? –

Trả lời

18

Bạn có thể sử dụng @UniqueConstraint một cái gì đó như thế này:

@Entity 
@Table(name = "dm_action_plan", 
     uniqueConstraints={ @UniqueConstraint(columnNames= "command","model") }) 
public class ActionPlan { 
    @Id 
    private int pk; 

    @Column(name = "command", nullable = false) 
    private String command; 

    @Column(name = "model", nullable = false) 
    String model; 
} 

này sẽ cho phép thực hiện JPA của bạn để tạo ra DDL cho các hạn chế duy nhất.

+0

Biểu mẫu chính xác như sau: @Table (name = "dm_action_plan") @UniqueConstraint (columnNames = {"command", "model"}) – homaxto

+0

homaxto: Theo đặc điểm kỹ thuật của EJB3.0, Michel đã cho đúng mẫu. – Nicolas

0

Sử dụng @GeneratedValue để chỉ ra rằng chìa khóa sẽ được tạo ra và @UniqueConstraint thể hiện tính duy nhất

@Entity 
@Table(name = "dm_action_plan" 
     uniqueConstraint = @UniqueConstraint({"command", "model"}) 
) 
public class ActionPlan { 
    @Id 
    @GeneratedValue 
    private int pk; 
    @Column(name = "command", nullable = false) 
    private String command; 
    @Column(name = "model", nullable = false) 
    String model; 
} 
+0

Nó sẽ không tạo ra một ràng buộc hợp chất. Nó sẽ tạo ra hai ràng buộc, mỗi cái cho mỗi tên cột mà bạn đã chú thích trong @UniqueConstraint. – emanuelcds

+0

Sau đó triển khai JPA của bạn sai. Đặc tả JPA2, §11.1.49 columnNames là "Một mảng các tên cột tạo nên ràng buộc ** ** ((ràng buộc, không ràng buộc). – Nicolas

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