2010-02-11 139 views
4

我想坚持一个枚举作为内含价值(最好使用它的字符串表示,但即使顺序将是确定现在)JPA /休眠,@Embedded和枚举

枚举:

@Embeddable 
public enum DayOfTheWeek { 
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; 

public int toCalendar() throws EnumConstantNotPresentException{ 
    switch (this) { 
    case SUNDAY: 
    return Calendar.SUNDAY; 
    case MONDAY: 
    return Calendar.MONDAY; 
    case TUESDAY: 
    return Calendar.TUESDAY; 
    case WEDNESDAY: 
    return Calendar.WEDNESDAY; 
    case THURSDAY: 
    return Calendar.THURSDAY; 
    case FRIDAY: 
    return Calendar.FRIDAY; 
    case SATURDAY: 
    return Calendar.SATURDAY; 
    } 
    throw new EnumConstantNotPresentException(this.getClass(), "Unknown value ["+this.name()+"]"); 
} 

public static DayOfTheWeek fromCalendarDay(int day) { 
    switch (day) { 
    case Calendar.SUNDAY: 
    return SUNDAY; 
    case Calendar.MONDAY: 
    return MONDAY; 
    case Calendar.TUESDAY: 
    return TUESDAY; 
    case Calendar.WEDNESDAY: 
    return WEDNESDAY; 
    case Calendar.THURSDAY: 
    return THURSDAY; 
    case Calendar.FRIDAY: 
    return FRIDAY; 
    case Calendar.SATURDAY: 
    return SATURDAY; 
    } 
    return null; 
} 

public static DayOfTheWeek getByDate(Date date) { 
    Calendar calendar = GregorianCalendar.getInstance(); 
    calendar.setTime(date); 
    return fromCalendarDay(calendar.get(Calendar.DAY_OF_WEEK)); 
} 

@Override 
/** 
    * Should return the localized day of the week 
    */ 
public String toString() { 
    Calendar c = new GregorianCalendar(); 
    c.set(Calendar.DAY_OF_WEEK, this.toCalendar()); 
    SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat 
    .getInstance(); 
    sdf.applyPattern("EEEEEEEEEE"); 

    return sdf.format(c.getTime()); 
} 

} 

的类别:

@Entity 
public class Day implements Serializable { 

... 

@Enumerated 
@Embedded 
private DayOfTheWeek dayOfTheWeek; 

... 

@Id 
@GeneratedValue 
private Long id; 

public void setId(Long id) { 
    this.id = id; 
} 

public Long getId() { 
    return id; 
} 

public void setDayOfTheWeek(DayOfTheWeek dayOfTheWeek) { 
    this.dayOfTheWeek = dayOfTheWeek; 
} 

public DayOfTheWeek getDayOfTheWeek() { 
    return dayOfTheWeek; 
} 

... 
} 

现在,这里是堆叠的坚持 “日” 的时候,有趣的部分:

org.springframework.orm.hibernate3.HibernateSystemException: No default constructor for entity: xxx.yyyy.zzz.DayOfTheWeek; nested exception is org.hibernate.InstantiationException: No default constructor for entity: xxx.yyyy.zzz.DayOfTheWeek 

我试过几件事,无法以任何方式让它工作,任何想法?

回答

10

取出@Embedded@Embeddable注释只需使用@Enumerated(EnumType.STRING)把它作为一个字符串。

作为一个侧面说明,考虑定义你这样的枚举,以避免开关

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 

public enum DayOfTheWeek { 
    SUNDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.SUNDAY; 
     } 

    }, 
    MONDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.MONDAY; 
     } 
    }, 
    TUESDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.TUESDAY; 
     } 
    }, 
    WEDNESDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.WEDNESDAY; 
     } 
    }, 
    THURSDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.THURSDAY; 
     } 
    }, 
    FRIDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.FRIDAY; 
     } 
    }, 
    SATURDAY { 
     @Override 
     public int toCalendar() { 
      return Calendar.SATURDAY; 
     } 
    }; 

    public abstract int toCalendar(); 

    public static DayOfTheWeek fromCalendarDay(int day) { 

     for (DayOfTheWeek dayOfWeek : DayOfTheWeek.values()) { 
      if (dayOfWeek.toCalendar() == day) { 
       return dayOfWeek; 
      } 
     } 

     return null; // Consider throwing IllegalArgumentException 
    } 

    public static DayOfTheWeek getByDate(Date date) { 
     Calendar calendar = GregorianCalendar.getInstance(); 
     calendar.setTime(date); 
     return fromCalendarDay(calendar.get(Calendar.DAY_OF_WEEK)); 
    } 

    @Override 
    /* 
    * Should return the localized day of the week 
    */ 
    public String toString() { 
     Calendar c = new GregorianCalendar(); 
     c.set(Calendar.DAY_OF_WEEK, this.toCalendar()); 
     SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat 
       .getInstance(); 
     sdf.applyPattern("EEEEEEEEEE"); 

     return sdf.format(c.getTime()); 
    } 

} 
+0

使用字段是比写'toCalendar()'返回一个常量值更好的解决方案。 – 2014-01-19 19:37:20

6

为什么你想要枚举为@Embeddable。简单地将它注释为列有什么问题?

@Enumerated(EnumType.STRING) 
@Column(name = "...") 
public DayOfTheWeek getDayOfTheWeek() { 
    return dayOfTheWeek; 
} 
4

我知道这个问题已经回答了,这是很久以前的事。

我只是想建议您的枚举建设进一步提高。 这里是:

public enum DayOfTheWeek { 
     SUNDAY(Calendar.SUNDAY), 
     MONDAY(Calendar.MONDAY), 
     TUESDAY(Calendar.TUESDAY), 
     WEDNESDAY(Calendar.WEDNESDAY), 
     THURSDAY(Calendar.THURSDAY), 
     FRIDAY(Calendar.FRIDAY), 
     SATURDAY(Calendar.SATURDAY); 

     DayOfTheWeek(int dayOfTheWeek){ 
      this.dayOfTheWeek = dayOfTheWeek; 
     } 
     int dayOfTheWeek; 

     public int toCalendar(){ 
      return dayOfTheWeek; 
     } 

    } 

谢谢你们,请注意!玩的开心!