web-dev-qa-db-ja.com

@ElementCollectionを使用したマッピングSet <enum>

私は次の列挙型を持っています:

package ir.raysis.tcs.rule.days;

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

次のようにSet<Days>日としてマッピングしようとしました。

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

ただし、次の例外がスローされます。

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)

どうすれば適切にマッピングできますか?

21
MoienGK

将来のグーグルのために!最終的に私は問題を解決することができました、私はちょうど私のコードのどこかに注釈を置く必要がありました、

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

ご覧のとおり、(属性宣言コードの前に配置するのではなく)getterメソッドの前にアノテーションコードを記述して問題を解決したので、これを引き起こす原因を説明できる人なら誰でも感謝します。ありがとうございました

52
MoienGK

@CollectionTableではなく@JoinTableを使用してみてください

3
Pace