java - Play! 中的抽象模型界面ORM,如何加载 initial-data.yml?

标签 java design-patterns orm persistence playframework

我有一个名为 Booking 的模型,它有一个持久的 DateTime 字段。但是,我不想直接与该字段交互,而是通过两个 transient 字符串字段datetime 进行交互。问题是我不知道 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;
  }

最佳答案

play 使用的 JPA 使用默认的空构造函数来启动类。在您的情况下,Play 框架(我猜)创建了一个 Booking() 构造函数。 JPA 然后使用 getter 和 setter 来设置实体的属性。

也许您可以使用 JPA 中的 @PostLoad 注释。这会导致在您的持久数据加载到实体后调用带注释的方法。

更新:我提到了@PostLoad,但也许@PrePersist 是更好的选择,用于检查您的DateTime 字段是否为空,如果是这种情况,您可以将其设置为默认值。像这样:

@PrePersist
public void prePersist()
{
    if(this.dateTime==null)
    {
        this.dateTime = toDateTime(this.date, this.time);
    }
}

关于java - Play! 中的抽象模型界面ORM,如何加载 initial-data.yml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387830/

相关文章:

php - 如何避免到处传递上下文对象?

design-patterns - 使用字符串与枚举作为工厂方法的参数?

mysql - 使用 Kohana ORM 按外部表值排序

php - 如何使用 Auth 模块从 Kohana 3 检索所有用户和所有角色?

python - SQLAlchemy:单表继承,子项中的同一列

java - JButton alpha 背景随着鼠标悬停而改变

java - 启动一个线程后,我们如何保持 run 函数运行?我有很多想法,但我不确定哪个更专业?

java - Spring Security >5.0.0 移除了 Md5PasswordEncoder

java - 仅当字符串位于括号之间时才用逗号分割字符串

java - 基于物联网的家庭自动化系统(如 Alexa)中使用的设计模式