2013-02-11 12 views
6

Voglio rappresentare un insieme di opzioni come un EnumSet nella mia entità e come una relazione uno-a-molti nel mio database. Come è fatto correttamente? Posso trovare solo risposte (pre-annotazioni) vecchie o risposte che non utilizzano due tabelle.Come mantenere un EnumSet (utilizzando due tabelle del database)?

ho definito le seguenti tabelle:

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

questa classe entità:

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

} 

e, naturalmente, un enum:

public enum UserOption { 

    OPTION_A, 
    OPTION_B, 
    OPTION_C; 

} 

Quando inizio Tomcat ottengo la seguente eccezione :

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

Questa eccezione è la radice di un gruppo di eccezioni che si causano a vicenda. Causa un javax.persistence.PersistenceException (Impossibile creare EntityManagerFactory), che a sua volta causa alcune eccezioni di dipendenza dipendenza.

Ammetto che non sono abbastanza esperto in JPA/Hibernate per capire cosa sto sbagliando. Qualcuno può aiutarmi?

risposta

6

Si scopre che la risposta è più semplice di quanto pensassi. Non è possibile combinare annotazioni JPA su variabili di istanza e getter. Le annotazioni stesse vanno bene. Ho cambiato la mia classe di entità come segue e ora funziona tutto bene.

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

} 
Problemi correlati