我有一个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();
**如果我没有说清楚,我只是不知道如何使用数据库中设置的默认值进行更新。
答案 0 :(得分:1)
您想要将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;
答案 1 :(得分:0)
如果我正确理解了这个问题,您需要确保MODIFIED_DATE列始终设置为CURRENT_TIMESTAMP。然后,当数据库实体更新并且修改了其他字段时,MODIFIED_DATE列将设置为CURRENT_TIMESTAMP。
我假设您的数据库表看起来像这样:
h()
您要做的是将@PreUpdate方法添加到您的数据库实体类,并让它每次都将modifiedDate属性设置为新的Date()。然后,每当对实体进行更新时,MODIFIED_DATE列将被设置为新的日期!
以下是一个例子:
w()
尝试一个简单的例子,看看它是如何工作的:
import math
import sys
def h():
height = int(input("Please enter student's height in inches: "))
return height
def w():
weight = int(input("Please enter student's weight in pounds: "))
return weight
def bmi(height, weight):
total = float((weight * 703)/(height * height))
return total
def printbmi(name):
print(name + "'s BMI Profile")
height = h()
print("Height:", str(height), "inches")
weight = w()
print("Weight:", str(weight), "lbs")
print("BMI Index:" + str(float(round(bmi(height, weight), 1))))
def main(name):
printbmi(name)
print("King's BMI Calculator")
while True:
name = input("Please enter student's name or press 0 to quit:")
if name == "0":
break
else:
main(name)
答案 2 :(得分:0)
您可以使用注释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,没有setter。 JPA将自行比较和更新时间戳值。否则,如果您依赖数据库为您生成它,您可以尝试@GeneratedValue(strategy = GenerationType.IDENTITY)
或AUTO,但我很确定它在Hibernate中不起作用。也许它可以在其他JPA提供商中使用。在Hibernate中,AUTO值总是回落到SEQUENCE,因此该策略没有机会工作。