tem*_*msa 5 java enums persistence jpa
我试图将Enum保持为嵌入值(理想情况下使用它的字符串表示,但即使序数也可以正常)
恩欧姆:
@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());
}
}
Run Code Online (Sandbox Code Playgroud)
班级 :
@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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
现在,这是持久化"Day"时堆栈中有趣的部分:
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
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几件事,无论如何都无法让它发挥作用,任何想法?
Lom*_*mbo 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());
}
}
Run Code Online (Sandbox Code Playgroud)
为什么你想要枚举@Embeddable.简单地将其注释为列有什么问题?
@Enumerated(EnumType.STRING)
@Column(name = "...")
public DayOfTheWeek getDayOfTheWeek() {
return dayOfTheWeek;
}
Run Code Online (Sandbox Code Playgroud)
我知道这个问题已经回答了很久以前.
我只是想建议进一步增强你的枚举结构.在这里:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你们,关注你们!玩得开心!