JPA EntityManager-使用合并生成默认值



我有一个具有创建日期和修改日期列的JPA实体。在创建/持久性上,创建的日期和修改日期均由数据库中给出的默认值生成,即时间戳。但是,创建有效,但是,当我尝试进行更新/合并时,我无法弄清楚如何使用数据库中的默认值更改修改的日期。有建议吗?这是当前的设置:

....
@Temporal(TemporalType.DATE)
@Column(name="CREATED_DATE", insertable = false, updatable = false)
private Date createdDate;
@Temporal(TemporalType.DATE)
@Column(name="MODIFIED_DATE", insertable = false)
private Date modifiedDate;
....

-

public Database changeDate(Database oldValues)
    Database newvalues = new Database();
    ....
    newValues.setCreatedDate(oldValues.getCreatedDate);
    //newValues.setModifiedDate(); <-- (Should use the default value in the database)
    ....
    em.merge(newValues); <-- (EntityManager)
    em.getTransaction().commit();

**,以防万一我没有清楚自己,我只是不知道如何使用数据库中设置的默认值进行更新。

您要将null值设置为迄今为止。请在您的日期注释中添加无效的属性。它将起作用。

在您的注释中添加它 nullable = true

@Temporal(TemporalType.DATE)
@Column(name="CREATED_DATE",nullable = true, insertable = false, updatable = false)
private Date createdDate;
@Temporal(TemporalType.DATE)
@Column(name="MODIFIED_DATE", nullable = true, insertable = false)
private Date modifiedDate;

有一个注释您可以使用javax.persistence.Version

@Column(name="CREATED_DATE", updatable = false)
private java.sql.Timestamp createdDate = new java.sql.Timestamp(System.currentTimeMillis());
@Version
@Column(name="MODIFIED_DATE")
private java.sql.Timestamp modifiedDate;

这两个字段都只需要一个getter,没有设定器。JPA将自己比较和更新时间戳值。否则,如果您依靠数据库为其生成它,则可以尝试@GeneratedValue(strategy = GenerationType.IDENTITY)或自动,但我很确定这在Hibernate中不起作用。也许它将在其他JPA提供商中使用。在冬眠中,自动是始终为顺序倒下的价值,因此没有机会使用该策略。

如果我正确理解问题,则要确保Modified_date列始终设置为Current_Timestamp。然后,当数据库实体更新并修改了其他字段时,Modified_date列将设置为current_timestamp。

我假设您的DB表看起来像这样:

CREATE TABLE Database (
    ID int NOT NULL,
    CREATED_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    MODIFIED_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

您想做的是在数据库实体类中添加@preupdate方法,并将修改后的属性设置为每次新的日期()。然后,每当对实体进行更新时,Modified_date列将设置为新日期!

这是一个示例:

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

尝试一个简单的示例,看看它的工作原理:

em.getTransaction().begin();
Database db = new Database(1, "First Value");
em.persist(db);
em.getTransaction().commit();
em.getTransaction().begin();
Database db2 = em.find(Database.class, 1);
db2.setValue("New Value!");
em.getTransaction().commit();

最新更新