JPA EntityManager - 使用merge生成默认值?

时间:2017-02-22 20:43:04

标签: java 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();

**如果我没有说清楚,我只是不知道如何使用数据库中设置的默认值进行更新。

3 个答案:

答案 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,因此该策略没有机会工作。