2013-04-14 11 views
18

Mam następujący ENUM:Mapowanie Set <enum> użyciu @ElementCollection

package ir.raysis.tcs.rule.days; 

public enum Days { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY; 
} 

próbowałem mapować go jako Set<Days> dni w następujący sposób:

@ElementCollection(targetClass = Days.class) 
@JoinTable(name = "days",joinColumns = @JoinColumn(name = "rule_id")) 
@Column(name ="daysOfWeek", nullable = false) @Enumerated(EnumType.STRING) 
private Set<Days> days = new HashSet<>(); 

jednak rzuca następujący wyjątek:

Initial SessionFactory creation failed.org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: rule, for columns: [org.hibernate.mapping.Column(days)] 
Apr 14, 2013 4:15:17 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [jsp] in context with path [/ptcs] threw exception [javax.servlet.ServletException: java.lang.ExceptionInInitializerError] with root cause 
org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: rule, for columns: [org.hibernate.mapping.Column(days)] 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306) 
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:290) 
    at org.hibernate.mapping.Property.isValid(Property.java:217) 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:235) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865) 
    at ir.raysis.tcs.db.HibernateUtil.<clinit>(HibernateUtil.java:18) 
    at ir.raysis.tcs.db.SaveUpadteDelete.save(SaveUpadteDelete.java:33) 
    at ir.raysis.tcs.db.dBAllFunc.save(dBAllFunc.java:35) 
    at ir.raysis.tcs.db.AbsDBObject.save(AbsDBObject.java:45) 
    at ir.raysis.tcs.action.CreateMemberAction.execute(CreateMemberAction.java:31) 
    at org.apache.jsp.action.createMember_jsp._jspService(createMember_jsp.java:79) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Jak poprawnie go zmapować?

Odpowiedz

42

dla przyszłych pracowników Google! w końcu udało mi się rozwiązać ten problem, po prostu musiałem umieścić adnotacje gdzieś indziej w moim kodu,

@ElementCollection(targetClass = Days.class) 
@CollectionTable(name = "days", joinColumns = @JoinColumn(name = "rule_id")) 
@Column(name = "daysOfWeek", nullable = false) 
@Enumerated(EnumType.STRING) 
public Set<Days> getDays() { 
    return days; 
} 

jak widać napisałem kod adnotacji powyżej przed metody pochłaniacza (zamiast umieszczania go przed kod deklaracji atrybutu) i problem rozwiązany, każdy, kto może mi wyjaśnić, co to powoduje, zostanie doceniony. dziękuję

+13

Jestem jednym z przyszłych pracowników Google, dziękuję! –

+2

Warto dodać, że @Column (name = "daysOfWeek") jest w tym przypadku kolumną w tabeli zbierania "dni" (nie jest to tabela "reguła"). – malloc4k

+0

Robimy praktycznie to samo i używając Envers. Najdziwniejsza rzecz w JBoss Developer Studio (eclipse), dodanie @ElementCollection w User (dla Role, enum) tworzy błędy kompilacji w większości reszty modelu. Czy ktoś ma pomysły, co może się wydarzyć? – LinuxLars

3

Spróbuj użyć @CollectionTable i nie @JoinTable

+0

thnx za odpowiedź, ale to nie rozwiązało problemu - jakiś pomysł? – MoienGK

+0

Hmm ... spróbuj pozbyć się '@ ElementCollection' i umieścić targetClass na' @ JoinTable'. – Pace

Powiązane problemy