我有一个具有创建日期和修改日期列的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();