2

我有一个基类:

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Version;

import play.db.ebean.Model;

@MappedSuperclass
public class TimeStampable extends Model {

    @Id
    @GeneratedValue
    public Long id;

    @Column(name = "created_at")
    public Date createdAt;

    @Column(name = "updated_at")
    public Date updatedAt;

    @Version
    public int version;

    @Override
    public void save() {
        if (this.id == null) {
            createdAt();
        } else {
            updatedAt();
        }
        super.save();
    }

    @Override
    public void update() {
        updatedAt();
        super.update();
    }

    @Override
    public void update(Object o) {
        updatedAt();
        super.update(o);
    }

    @PrePersist
    void createdAt() {
        this.createdAt = this.updatedAt = new Date();
    }

    @PreUpdate
    void updatedAt() {
        this.updatedAt = new Date();
    }
}

和2个模型

public class Request extents TimeStampable {
     @OneToMany(cascade = CascadeType.ALL)
     public List<Response> responses = new ArrayList<Response>();
}

public class Response extents TimeStampable {
}

当我尝试保存请求对象时,我看到我的数据库已为请求对象正确填充了 created_at updated_at 字段,但对于响应对象,这些值为空。响应对象的其他字段具有预期值(我已填写)。

这是我保存请求的方式。

Request req = new Request();
Response res = new Response();
// code to populate response fields

request.add(res);
Ebean.save(req);

我在这里想念什么?

4

1 回答 1

1

似乎@PrePersistor@PreUpdate没有使用您提供的逻辑调用。这些操作在使用save()方法手动调用时执行。我为您的问题找到了两种解决方案。

首先,因为您使用单向 OneToMany关系(Response对象可能不知道Request与其关联的对象,因为对象上没有类型Request的字段),所以在保存对象之前Response不允许调用对象save()上的方法。ResponseRequest

如果你坚持使用这种关系类型。在模型上,在and字段TimeStampable上添加这些注释:createdAtupdatedAt

@Column(name = "created_at")
@CreatedTimestamp
public Date createdAt;

@Column(name = "updated_at")
@UpdatedTimestamp
public Date updatedAt;

这两个注解都是eBean注解。

第二种选择是,您可以使用和类之间的双向关系。在类上将字段添加到引用对象。ResponseRequestResponseRequest

public class Response extends Timestampable {
    @ManyToOne // to make relation bidirectional
    public Request request;
}

TimeStamp超类上,您可以删除 @UpdatedTimestamp@CreatedTimestamp注释,因为您可以在控制器上调用save()方法。如果您使用这种方法,以下是在控制器上填充数据的示例:

// create new request object and save
Request request = new Request();
request.save();

// populate the response
Response response1 = new Response();
response.request = request;
Response response2 = new Response();
response.request = request;
response.save();
response.save();

建议

我建议您使用第二种方法,因为如果您有Response对象,您将知道Request与之关联的对象。

于 2013-05-07T11:59:55.233 回答