2013-04-14 21 views
18

Tôi đã enum sau:Mapping Set <enum> sử dụng @ElementCollection

package ir.raysis.tcs.rule.days; 

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

tôi đã cố gắng để ánh xạ nó như là một Set<Days> ngày như sau:

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

Tuy nhiên, nó ném ngoại lệ sau đây:

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) 

Làm cách nào để ánh xạ chính xác?

Trả lời

42

cho nhân viên của Google trong tương lai! cuối cùng tôi quản lý để giải quyết vấn đề, tôi chỉ cần phải đặt chú thích ở một nơi khác trong mã của tôi,

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

như bạn có thể thấy tôi đã viết mã chú thích ở trên và trước khi phương thức getter (thay vì đặt nó trước mã khai báo thuộc tính) và vấn đề được giải quyết, bất cứ ai có thể giải thích cho tôi nguyên nhân gây ra điều này sẽ được đánh giá cao. cảm ơn bạn

+13

Tôi là một trong những googlers trong tương lai, cảm ơn bạn! –

+2

Giá trị thêm rằng @Column (name = "daysOfWeek") là trong trường hợp này một cột trong bảng thu thập 'ngày' (không phải là bảng 'quy tắc'). – malloc4k

+0

Chúng tôi đang làm hầu như giống nhau và sử dụng Envers. Điều kỳ lạ nhất, trong JBoss Developer Studio (nhật thực), thêm @ElementCollection vào User (cho vai trò, một enum) tạo ra lỗi xây dựng trong hầu hết các phần còn lại của mô hình. Bất cứ ai cũng có một ý tưởng những gì có thể xảy ra? – LinuxLars

3

Hãy thử sử dụng @CollectionTable và không @JoinTable

+0

thnx để trả lời nhưng điều đó không giải quyết được vấn đề - bất kỳ ý tưởng nào? – MoienGK

+0

Hmm ... hãy thử loại bỏ '@ ElementCollection' và đặt targetClass trên' @ JoinTable'. – Pace