Абстрагированная модель интерфейса в Play!ORM, как загружается initial-data.yml? - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть модель с именем Booking, в которой есть постоянное поле DateTime.Однако я не хочу напрямую взаимодействовать с этим полем, а скорее через два поля Transient String, date и time .Проблема в том, что я понятия не имею, как / когда play загружает данные в поля - кажется, что он не использует конструктор, который я предоставляю, потому что поле DateTime всегда пустое.

public class Booking extends Model {

  @Column
  @Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
  public DateTime datetime;
  public Integer duration;
  @Transient
  public String date = "1970-01-01";
  @Transient
  public String time = "00:00";

  public Booking(String date, String time, Integer duration) {
    this.datetime = toDateTime(date, time);
    this.duration = duration;
  }

  public void setDate(String dateStr) {
    this.date = dateStr;
    this.datetime = toDateTime(dateStr, this.time);
  }

  public void setTime(String timeStr) {
    this.time = timeStr;
    this.datetime = toDateTime(this.date, timeStr);
  }

  public String getDate() {
    DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd");
    return this.datetime.toString(format); //NullPointerException here!
  }

  public String getTime() {
    DateTimeFormatter format = DateTimeFormat.forPattern("kk:mm");
    return this.datetime.toString(format);//NullPointerException here!
  }

вот метод toDateTime:

  private DateTime toDateTime(String date, String time){
    DateTimeFormatter fmt = ISODateTimeFormat.dateHourMinute();
    DateTime dt = fmt.parseDateTime(date+"T"+time);

    return dt;
  }

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

JPA, который использует play, использует пустой конструктор по умолчанию для инициации класса. В вашем случае платформа Play (я думаю) создает конструктор Booking (). Затем JPA использует методы получения и установки для установки свойств вашей сущности.

Возможно, вы могли бы использовать аннотацию @PostLoad от JPA. Что вызывает вызов аннотированного метода после загрузки ваших постоянных данных в сущность.

Обновление: Я упомянул @PostLoad, но, возможно, @PrePersist - лучший вариант, чтобы проверить, является ли ваше поле DateTime пустым, и если это так, вы можете установить его со значением по умолчанию. Таким образом, вот так:

@PrePersist
public void prePersist()
{
    if(this.dateTime==null)
    {
        this.dateTime = toDateTime(this.date, this.time);
    }
}
0 голосов
/ 14 сентября 2011

Похоже, что вы можете определить конструктор по умолчанию, который не принимает никаких параметров для настройки вашего объекта, когда JPA загружает его.Вот так:

public Booking() {
  DateTimeFormatter fmt = ISODateTimeFormat.dateHourMinute();
  this.datetime = fmt.parseDateTime("1970-01-01T00:00");
}

Теперь единственная проблема заключается в том, что он использует те же сеттеры, которые я определил при извлечении из базы данных: * Причина: java.lang.IllegalArgumentException: Неверный формат: "ISO8601: 2011-08-25T02: 00: 00 + 0200 ... "*

0 голосов
/ 14 сентября 2011

Я предполагаю, что DateTime - это joda DateTime в приведенном выше коде.Я не думаю, что JPA / Hibernate поддерживает этот тип данных для сохранения.Поддерживаются метка времени, календарь, доступный как часть JDK.

Вы должны определить новый тип пользователя в Hibernate для работы с DateTime.Проверьте эту ссылку

...