2009-10-20 34 views
16

Tôi cần ánh xạ các enums không triển khai giao diện trước đó tới cơ sở dữ liệu hiện có, lưu trữ enums trong cùng một bảng với lớp chủ sở hữu bằng cách sử dụng @Enumerated(EnumType.STRING).Lập bản đồ enum Hibernate

class A { 
    HasName name; 
} 

interface HasName { 
    String getName(); 
} 

enum X implements HasName { 
    John, Mary; 

    public String getName() { return this.name(); } 
} 

enum Y implements HasName { 
    Tom, Ann; 

    public String getName() { return this.name(); } 
} 

Cách ánh xạ phải được xử lý trong trường hợp này? Sự tồn tại của cơ sở dữ liệu không thay đổi khi tất cả các enums thực hiện giao diện sẽ có các giá trị khác nhau, nhưng tôi không chắc chắn về cách các đối tượng sẽ được lấy ra từ DB (tôi có cần một người lập bản đồ tùy chỉnh không, enum bằng cách sử dụng các lớp enum quy định? Có Hibernate natively hỗ trợ chức năng này?).

Trả lời

7

Có thể để tạo ra một tùy chỉnh UserType (ví dụ this one) và sử dụng nó từ ánh xạ của bạn

<property name="type" not-null="true"> 
    <type name="at.molindo.util.hibernate.EnumUserType"> 
    <param name="enumClass"> 
     com.example.MyEnum 
    </param> 
    </type> 
</property> 

EDIT: Hibernate đi kèm với EnumType riêng của nó (từ 3.2 trong hibernate-chú thích, kể từ 3.6 ở chế độ ngủ đông-core - không biết về nó trong chú thích ngủ đông tại thời điểm viết, nhưng xem Diego's answer).

+0

Trong trường hợp của tôi, tôi không biết lớp học của enum sẽ là gì. Khi instantiating 'A', Hibernate sẽ cần phải chọn một trong các {X, Y} enums. – dm3

+0

Không khó để tinh chỉnh việc triển khai UserType mẫu theo nhu cầu của bạn. Ví dụ: thay vì chỉ lưu trữ giá trị, bạn cũng có thể lưu trữ lớp (ví dụ: com.example.X.John hoặc X.John, nhưng bạn sẽ cần ánh xạ từ X đến com.example.X) – sfussenegger

+0

Có nghĩa là tôi cần một người lập bản đồ tùy chỉnh (không thấy liên kết của bạn với pastebin). Cảm ơn câu trả lời. – dm3

50

Hibernate cung cấp org.hibernate.type.EnumType để ánh xạ Các loại được liệt kê. Ví dụ,

package com.igalia.enumerates; 

public enum Status { 
    BUSY, 
    AVAILABLE; 
} 

package com.igalia.entities; 

class MyClass { 
    private Status status; 
} 

Sau đó, làm bản đồ Hibernate của bạn như sau:

<class name="MyClass"> 
    <id name="id"> 
     <generator class="native"/> 
    </id> 

    <property name="status"> 
     <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.igalia.enumerates.Status</param> 
     </type> 
    </property> 
</class> 

Và đó là nó. Nếu bạn thích sử dụng chú thích JPA thay vì hbm.xml, hãy sử dụng @Enumerated (EnumType.STRING). Kiểm tra tại đây:

Enumerations in Hibernate

+0

Làm cách nào để đặt giá trị mặc định cho điều đó? Tôi đã thêm phần tử sau vào nhưng không hiệu quả với tôi: Timo

+1

@valmar bạn có thể khởi tạo * trạng thái * ở cấp lớp (hoặc thực hiện nó trong hàm tạo của nó). Ví dụ: 'trạng thái Trạng thái riêng tư = Trạng thái.BUSY;' –

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