2013-02-11 59 views
6

Tôi muốn đại diện cho một tập hợp các tùy chọn như là một EnumSet trong thực thể của tôi và như một mối quan hệ một-nhiều trong cơ sở dữ liệu của tôi. Cách này được thực hiện đúng cách? Tôi chỉ có thể tìm câu trả lời hoặc câu trả lời cũ (pre-annotations) không sử dụng hai bảng.Làm thế nào để duy trì một EnumSet (sử dụng hai bảng cơ sở dữ liệu)?

tôi xác định các bảng sau:

CREATE TABLE Users (
    id      SERIAL PRIMARY KEY, 
    name     VARCHAR(255) NOT NULL UNIQUE 
); 

CREATE TABLE User_Options (
    user_id     INT, 
    user_option    VARCHAR(255), 
    PRIMARY KEY (user_id, user_option), 
    FOREIGN KEY (user_id) REFERENCES Users(id) 
       ON DELETE CASCADE 
       ON UPDATE CASCADE 
); 

lớp thực thể này:

@Entity(name = "Users") 
public final class User { 

    @Id 
    @GeneratedValue 
    private int id; 

    @Column(nullable = false, unique = true) 
    private String name; 

    private final Set<UserOption> options; 

    { 
     this.options = EnumSet.noneOf(UserOption.class); 
    } 

    /* plain getter for id included */ 

    /* plain getter and setter for name included */ 

    @ElementCollection(fetch = FetchType.EAGER) 
    @Enumerated(EnumType.STRING) 
    @CollectionTable(name = "User_Options" 
      , joinColumns = @JoinColumn(name = "user_id")) 
    @Column(name = "user_option", nullable = false) 
    public Set<UserOption> getOptions() { 
     return this.options; 
    } 

} 

và dĩ nhiên một enum:

public enum UserOption { 

    OPTION_A, 
    OPTION_B, 
    OPTION_C; 

} 

Khi tôi bắt đầu Tomcat tôi nhận được ngoại lệ sau đây :

org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: Users, for columns: [org.hibernate.mapping.Column(options)] 

Ngoại lệ này là gốc của một loạt các ngoại lệ gây ra lẫn nhau. Nó gây ra một javax.persistence.PersistenceException (Không thể xây dựng EntityManagerFactory), do đó gây ra một số ngoại lệ tiêm phụ thuộc.

Tôi thừa nhận tôi không thạo đủ trong JPA/Hibernate để hiểu những gì tôi đang làm sai. Ai có thể giúp tôi không?

Trả lời

6

Hóa ra câu trả lời đơn giản hơn tôi nghĩ. Bạn không thể kết hợp chú thích JPA trên các biến cá thể và các getters. Các chú thích cũng tốt. Tôi đã thay đổi lớp thực thể của tôi như sau và tất cả mọi thứ hoạt động tốt ngay bây giờ.

@Entity(name = "Users") 
public final class User { 

    @Id 
    @GeneratedValue 
    private int id; 

    @Column(nullable = false, unique = true) 
    private String name; 

    @ElementCollection(fetch = FetchType.EAGER) 
    @Enumerated(EnumType.STRING) 
    @CollectionTable(name = "User_Options" 
      , joinColumns = @JoinColumn(name = "user_id")) 
    @Column(name = "user_option", nullable = false) 
    private final Set<UserOption> options; 

    { 
     this.options = EnumSet.noneOf(UserOption.class); 
    } 

    /* plain getter for id included */ 

    /* plain getter and setter for name included */ 

    public Set<UserOption> getOptions() { 
     return this.options; 
    } 

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