2010-12-28 23 views
23

Làm cách nào để triển khai các ràng buộc duy nhất của tôi trên POJO của hibernate? giả sử cơ sở dữ liệu không chứa bất kỳ.Sử dụng hạn chế duy nhất trên Hibernate JPA2

Tôi đã thấy thuộc tính duy nhất trong chú thích @Column() nhưng tôi không thể làm cho nó hoạt động?
Điều gì xảy ra nếu tôi muốn áp dụng hạn chế này cho nhiều hơn một cột?

+0

'C' trong' @ Cột' và không phải 'c' !!! – KNU

Trả lời

32

Bascially, bạn không thể thực hiện hạn chế duy nhất mà không cần hỗ trợ cơ sở dữ liệu.

@UniqueConstraintunique thuộc tính của @Column là hướng dẫn cho công cụ tạo lược đồ để tạo ra ràng buộc sửa lỗi, chúng không tự thực hiện ràng buộc.

Bạn có thể thực hiện một số loại kiểm tra thủ công trước khi chèn các thực thể mới, nhưng trong trường hợp này, bạn nên biết các vấn đề có thể xảy ra với các giao dịch đồng thời.

Do đó, việc áp dụng các ràng buộc trong cơ sở dữ liệu là lựa chọn ưu tiên.

+1

Vì vậy, ứng dụng sẽ không thực thi các ràng buộc duy nhất trừ khi db thêm nó một cách rõ ràng? Tôi giả định ddl là tắt –

43

Bạn có thể khai báo các ràng buộc duy nhất bằng cách sử dụng @Table(uniqueConstraints = ...) chú thích trong lớp học của bạn

@Entity 
@Table(uniqueConstraints= 
      @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity { 
    ... 
} 
+0

Tôi đã cố gắng sử dụng nó nhưng nhật thực không thể xác định chú thích này –

+0

Chú thích nào? @UniqueConstraint? Đó là một từ javax.persistence.UniqueConstraint – Hons

+1

Tôi đã thêm một ràng buộc vào bảng nhưng nó không hoạt động –

19

Trong JPA2, bạn có thể thêm các hạn chế độc đáo trực tiếp đến lĩnh vực này:

@Entity 
@Table(name="PERSON_TABLE") 
public class Person{ 
    @Id 
    @Column(name = "UUID") 
    private String id; 

    @Column(name = "SOCIALSECURITY", unique=true) 
    private String socialSecurityNumber; 

    @Column(name = "LOGINID", unique=true) 
    private String loginId; 
} 

IMHO của nó tốt hơn nhiều để gán hạn chế duy nhất trực tiếp đến các thuộc tính hơn tại beggining của bảng.

Nếu bạn cần khai báo một khóa duy nhất tổng hợp, hãy khai báo nó trong chú thích @table là lựa chọn duy nhất của bạn.

+0

Đây có phải là một đường viền duy nhất cho một cột đơn hay đây là một đường viền duy nhất cho sự kết hợp của socialSecurityNumber và loginId? –

+13

@StephanSchielke Điều này tạo ra một ràng buộc duy nhất riêng biệt cho mỗi cột. Để tạo một ràng buộc duy nhất trên nhiều trường, bạn cần sử dụng cách tiếp cận của Hons. – Naliba

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