JPA/Hibernate, @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

Я попробовал несколько вещей и не мог заставить это работать всегда, какая-либо идея?

5
задан starblue 11 February 2010 в 19:47
поделиться

2 ответа

Удалите аннотации @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());
    }

}
10
ответ дан 18 December 2019 в 07:29
поделиться

Почему вы хотите, чтобы перечисление было @Embeddable. Что плохого в том, чтобы просто обозначить его как столбец?

@Enumerated(EnumType.STRING)
@Column(name = "...")
public DayOfTheWeek getDayOfTheWeek() {
    return dayOfTheWeek;
}
6
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: