2009-01-06 32 views
82

Thường hữu ích khi có một trường trong DAO có giá trị đến từ một liệt kê Java. Một ví dụ điển hình là DAO đăng nhập, nơi bạn thường có một trường mô tả người dùng là "NORMAL" hoặc "ADMIN". Trong Hibernate, tôi sẽ sử dụng 2 đối tượng sau đây để đại diện cho mối quan hệ này trong một (bán) typesafe cách:Các số trong Hibernate

class User { 
    String username; 
    String passwd; 
    UserType type; 
} 

class UserType { 
    private enum Type {ADMIN, NORMAL}; 
    private String type; 

    //Setters/Getters for Hibernate 
    public void setType(String type); 
    public String getType(); 

    //Setters/Getters for user 
    public void setUserType(UserType.Type t); 
    public UserType.Type getUserType(); 

    public static UserType fromType(UserType.Type t); 
} 

này hoạt động, nhưng tôi tìm thấy những lớp loại người dùng ungly và đòi hỏi quá nhiều bộ máy quan liêu chỉ để lưu trữ một vài giá trị. Lý tưởng nhất, Hibernate nên hỗ trợ trực tiếp các trường enum và sẽ tạo ra một bảng phụ để lưu trữ các giá trị đếm.

Câu hỏi của tôi là: Có cách nào để ánh xạ trực tiếp một lớp liệt kê trong Hibernate không? Nếu không, là mô hình của tôi để đại diện cho liệt kê đủ tốt hay tôi thiếu một cái gì đó? Những người khác sử dụng mẫu nào?

Trả lời

110

sử dụng hibernate hay chú thích JPA:

class User { 
    @Enumerated(EnumType.STRING) 
    UserType type 
} 

loại người dùng chỉ là một tiêu chuẩn java 5 enum .

Tôi không thể tưởng tượng điều này chỉ giới hạn ở các chú thích nhưng tôi thực sự không biết cách thực hiện điều này với các tệp hbm. Nó có thể rất phụ thuộc phiên bản, tôi đoán nhưng tôi khá chắc chắn rằng hibernate 3.2+ là bắt buộc.

chỉnh sửa: có thể trong một hbm, nhưng hơi lộn xộn, hãy xem đây forum thread

+3

@Nnumerated (EnumType.ORDINAL) có thể ánh xạ tới int hiệu quả hơn không? –

+4

có khả năng là hiệu quả hơn, nhưng tôi sẽ bỏ tiền vào việc không thể đo sự khác biệt trong một hệ thống thực. EnumType.ORDINAL thực sự là mặc định nếu bạn chỉ cần @Enumerated. Tôi nghĩ rằng hầu hết mọi người (đặc biệt là DBA) có xu hướng thích tên enum trong DB. –

+1

Làm thế nào tôi có thể thay đổi chiều dài cột cho các enums này? Tôi đã thử thêm chú thích Cột nhưng điều đó không được tôn trọng? –

15

Từ các tài liệu Hibernate: http://www.hibernate.org/272.html

Bạn có thể tạo một typedef mới cho mỗi enums của bạn và tham khảo các typedefs trong thẻ tài sản.

Ví dụ Mapping - inline <type> thẻ

<property name='suit'> 
    <type name="EnumUserType"> 
     <param name="enumClassName">com.company.project.Suit</param> 
    </type> 
    </property> 

Ví dụ Mapping - sử dụng <typedef>

<typedef name="suit" class='EnumUserType'> 
     <param name="enumClassName">com.company.project.Suit</param> 
    </typedef> 

    <class ...> 
    <property name='suit' type='suit'/> 
    </class> 
+0

Cảm ơn. Tôi đã biết về giải pháp đó rồi. Vấn đề là nó đòi hỏi tất cả các enums của bạn để sử dụng các kiểu nội bộ ngủ đông, có thể dẫn đến các vấn đề nếu bạn đang sử dụng DAO như DTO như trong trường hợp của tôi. Một giải pháp tốt hơn được mô tả ở đây: http://www.hibernate.org/273.html –

+1

Lưu ý rằng trong các phiên bản mới hơn tên tham số là 'enumClass' thay vì' enumClassName'. –

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