2013-02-11 12 views
6

Kuruluşumda EnumSet ve veritabanımda bire çok ilişki olarak bir seçenekler kümesini temsil etmek istiyorum. Bu nasıl düzgün yapılır? İki tabloyu kullanmadan sadece eski (ön açıklamaları) cevapları veya cevapları bulabilirim. EnumSet nasıl kalıcıdır (iki veritabanı tablosu kullanarak)?

aşağıdaki tablolar tanımlamıştır:

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

bu varlık sınıfı: Ben Tomcat başlattığınızda

public enum UserOption { 

    OPTION_A, 
    OPTION_B, 
    OPTION_C; 

} 

Aşağıdaki özel durum almak:

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

} 

ve tabii ki bir enum

:

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

Bu istisna, birbirini etkileyen bir grup istisnanın köküdür. Bu, bazı bağımlılık enjeksiyon istisnalarına neden olan bir javax.persistence.PersistenceException (EntityManagerFactory yapılamıyor) neden olur.

Kabul ediyorum ki, yanlış yaptığımı anlamak için JPA/Hazırda bekletme konusunda yeterince bilgim yok. Bana yardım eden var mı?

cevap

6

Yanıtın, düşündüğümden daha basit olduğu ortaya çıkıyor. JPA açıklamasını örnek değişkenler ve alıcılar üzerinde birleştiremezsiniz. Ek açıklamaları iyi. Varlık sınıfımı şu şekilde değiştirdim ve her şey iyi çalışıyor.

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

} 
İlgili konular