2013-02-11 41 views
6

मैं अपनी इकाई में एनमसेट के रूप में विकल्पों के एक सेट का प्रतिनिधित्व करना चाहता हूं और अपने डेटाबेस में एक से कई संबंधों के रूप में प्रतिनिधित्व करना चाहता हूं। यह ठीक से कैसे किया जाता है? मैं केवल पुराने (पूर्व-एनोटेशन) उत्तरों या उत्तर दो टेबल का उपयोग नहीं कर सकता हूं।एनमसेट (दो डेटाबेस टेबल का उपयोग करके) कैसे बने रहें?

मैं निम्न तालिकाओं में परिभाषित किया गया:

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

इस इकाई वर्ग:

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

} 

और निश्चित रूप से एक enum:

public enum UserOption { 

    OPTION_A, 
    OPTION_B, 
    OPTION_C; 

} 

जब मैं बिलाव शुरू मैं निम्नलिखित अपवाद :

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

यह अपवाद एक दूसरे के कारण अपवादों के समूह की जड़ है। यह javax.persistence.PersistenceException (EntityManagerFactory बनाने में असमर्थ) का कारण बनता है, जो बदले में कुछ निर्भरता इंजेक्शन अपवाद का कारण बनता है।

मैं मानता हूं कि मैं जेपीए/हाइबरनेट में पर्याप्त रूप से पर्याप्त नहीं जानता हूं कि मैं क्या गलत कर रहा हूं। क्या कोई व्यक्ति मेरी सहायता कर सकता है?

उत्तर

6

यह पता चला है कि उत्तर मैंने सोचा जितना आसान है। आप जेपीए-एनोटेशन को आवृत्ति चर और गेटर्स पर मिश्रित नहीं कर सकते हैं। एनोटेशन स्वयं ठीक हैं। मैंने अपनी इकाई वर्ग को निम्नानुसार बदल दिया और सब कुछ ठीक काम करता है।

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

}