java - JPA PrePersist 和 PreUpdate

标签 java hibernate jpa

我正在使用基本实体:

@MappedSuperclass
public class BaseEntity {
    private static final Logger L = LoggerFactory.getLogger(BaseEntity.class);

    String id;
    String name;
    String description;

    Date created;
    Date updated;

    public BaseEntity() {
        id = UUID.randomUUID().toString();
    }

    @PrePersist
    protected void onCreate() {
        created = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
        updated = new Date();
    }

    @Id
    @Column(name = "id", nullable = false)
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Temporal(TemporalType.TIMESTAMP)
    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    @Temporal(TemporalType.TIMESTAMP)
    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }
    ... snip

然后我有一个实体:

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "@baby_id", scope = Baby.class)
@Table(name="babies")
public class Baby extends BaseEntity {
    private static final Logger L = LoggerFactory.getLogger(Baby.class);

    Date dob;

    public Baby() {
        super();
    }

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
    ... snip ...

这是我的测试:

@Test
@Transactional
public void testCreateBaby() {
    Baby b = new Baby();
    b.setName("n");
    b.setDescription("baby");
    b.setDob(new Date());

    assertNull(b.getCreated());
    assertNull(b.getUpdated());
    em.persist(b);
    assertNotNull(b);
    assertNotNull(b.getCreated());
    assertNull(b.getUpdated());

    b.setName("n3");
    b = em.merge(b);
    em.persist(b);
    assertNotNull(b.getUpdated());
}

测试失败,因为 updated 字段未设置。我该怎么做呢?这是使用 arquillian 和 wildfly 进行测试的 Hibernate JPA。

最佳答案

正如 Alan Hay 所说,在这种情况下,持久化之前的 em.flush() 效果很好。这与建议的问题不重复,因为冲洗有效。

关于java - JPA PrePersist 和 PreUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37348564/

相关文章:

java - 无法在我的应用程序中使用 SWT 星云小部件

java - 按钮 ActionPerfomed 将字符串从 JList 移动到 JList

java - 使用 Equation 为矩阵元素赋值时出错

java - Hibernate分布式二级缓存提供 'free'复制?

java - 获取 Hibernate 序列 nextVal (Oracle) 时发生异常

java - 仅选择 JTree 中的叶子节点

java - 如何编写在实体实例上同步的 Java 代码

java - 我怎样才能进入我的记录器,每个 hibernate 查询的持续时间(以毫秒为单位)

java - ManyToOne 可选关系上的 JPA Criteria API

jpa - 了解 EJB : Not flushing 中的 JTA