23

Làm việc trên một số mã ngủ đông cũ.Làm thế nào để làm nhiều cột UniqueConstraint trong hbm?

Làm cách nào để làm như sau với hbm.xml (tệp ánh xạ hibernate) thay vì bằng chú thích?

@Table(name="users", uniqueConstraints = { 
    @UniqueConstraint(columnNames={"username", "client"}), 
    @UniqueConstraint(columnNames={"email", "client"}) 
}) 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    private int id; 
    private String username; 
    private String email; 
    private Client client; 
} 

Trả lời

20

Sử dụng properties tag:

... 
<properties name="uk1" unique="true"> 
     <property name="username" .../> 
     <many-to-one name="client" .../> 
</properties> 

<properties name="uk2" unique="true"> 
     <property name="email" .../> 
     <many-to-one name="client" update="false" insert="false" .../> 
</properties> 
... 

Tài liệu chiết xuất:

Các < tính > yếu tố cho phép định nghĩa của một tên, nhóm hợp lý của các thuộc tính của một lớp học. Việc sử dụng quan trọng nhất của cấu trúc là nó cho phép kết hợp các thuộc tính là mục tiêu của thuộc tính-ref. Đây cũng là một cách thuận tiện để xác định ràng buộc duy nhất nhiều cột .

Tất cả các tùy chọn có sẵn được mô tả trong Hibernate documentation.

+0

Xin chào, tôi biết đó là những gì tài liệu nói, nhưng điều đó không hiệu quả đối với tôi. Giải pháp là đặt 'unique' vào trong thẻ' column' thay vì thẻ 'property'' ' –

+1

Tôi không biết tại sao thẻ thuộc tính không hoạt động cho bạn (phiên bản hibernate?) nhưng định nghĩa của bạn sẽ không thể mô hình ràng buộc duy nhất nhiều cột. – Thierry

+0

nó là Hibernate 3, và giải pháp tôi đã làm việc đúng như tôi muốn! –

2

Bạn cũng có thể làm điều này:

<many-to-one name="client" unique-key="uk1,uk2" .../> 
    <property name="username" unique-key="uk1" .../> 
    <property name="email" unique-key="uk2" .../> 

Bạn không cần phải sử dụng thẻ trong hbm. Nếu bạn chỉ muốn nhiều ràng buộc duy nhất.

+0

Vui lòng xem [câu trả lời] đầu tiên này (https://stackoverflow.com/help/how-to-answer) Câu hỏi này được trả lời trước, rõ ràng là bạn có thể thêm trả lời ở đây. Nhưng bạn cần phải hiểu một số điểm trước khi trả lời. Trước tiên, không thêm câu trả lời được thêm trước đó với cùng một mã hoặc đề xuất. Thứ hai, không thêm câu trả lời quá phức tạp nếu người dùng đã hỏi rất cụ thể về vấn đề và những gì anh ấy cần để giải quyết vấn đề này. Thứ ba, Bạn có thể thêm nhận xét nếu bạn muốn đề xuất bất kỳ điều gì liên quan đến câu trả lời hoặc câu hỏi. –

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