2013-02-11 6 views
6

Ich möchte eine Reihe von Optionen als ein EnumSet in meiner Entität und als eine Eins-zu-viele-Beziehung in meiner Datenbank darstellen. Wie wird das richtig gemacht? Ich kann nur alte (Vorannotationen) Antworten oder Antworten finden, die nicht zwei Tabellen verwenden.Wie behalte ich ein EnumSet (mit zwei Datenbanktabellen)?

I definiert die folgenden Tabellen:

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 
); 

diese Objektklasse:

@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; 
    } 

} 

und natürlich eine Enumeration:

public enum UserOption { 

    OPTION_A, 
    OPTION_B, 
    OPTION_C; 

} 

Wenn ich Tomcat starten erhalte ich die folgende Ausnahme :

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

Diese Ausnahme ist die Wurzel einer Reihe von Ausnahmen, die sich gegenseitig verursachen. Es verursacht javax.persistence.PersistenceException (EntityManagerFactory kann nicht erstellt werden), was wiederum einige Abhängigkeitsinjektionsausnahmen verursacht.

Ich gebe zu, ich bin nicht gut genug in JPA/Hibernate, um zu verstehen, was ich falsch mache. Kann mir jemand helfen?

Antwort

6

Es stellt sich heraus, die Antwort ist einfacher als ich dachte. Sie können JPA-Annotation für Instanzvariablen und Getter nicht mischen. Die Anmerkungen selbst sind in Ordnung. Ich änderte meine Entity-Klasse wie folgt und alles funktioniert jetzt gut.

@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; 
    } 

}