Hibernate和Mysql对象不刷新时间戳列

时间:2017-01-06 11:31:11

标签: java mysql spring hibernate timestamp

我目前正在开发一个带有spring,hibernate和mysql的web应用程序。 问题是为所有对象添加created_at和updated_at时间戳。

我有以下摘要@MappedSuperClass:

@MappedSuperclass
public abstract class AbstractTimestampEntity {

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at", nullable = false)
    private Date created;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated_at", nullable = false, updatable = false)
    private Date updated;
...
}

在Mysql中为created_at定义了CURRENT_TIMESTAMP,为updated_at定义了CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

当我手动测试它时,它插入一个对象并更新它在mysql中的时间是正确的。但是我想编写自动测试,它不会从数据库中检索值并刷新对象。

// before update
sessionFactory.getCurrentSession().refresh(tester1);
Date before = tester1.getUpdated();
// update
userResource.updateUser(new UserDTO(tester1), tester1.getUserId());
// after update
sessionFactory.getCurrentSession().refresh(tester1);
Date after = ((User) sessionFactory.getCurrentSession().get(User.class, tester1.getUserId())).getUpdated();
// verify
assertTrue(before.before(after));

它将导致nullpointer异常,因为从未设置tester1对象的日期。 (Tester1 Object扩展AbstractTimestampEntity)

我使用sql-query手动检索日期:

SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery("SELECT updated_at FROM smarterTestDB.User WHERE userId="+tester1.getUserId());
sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List list = sqlQuery.list();
String test = list.get(0).toString();

它给了我mysql的设定值: 日期:{updated_at = 2017-01-06 12:25:59.0}

为什么不把它写在对象中?并且它没有给出关于TypeMissmatch或类似的任何错误。 @Temporal(TemporalType.TIMESTAMP)是不是从sql.Timestamp转换为util.Date?

亲切的问候

更新

我通过将对象传递给userResource来获取错误我构造了一个用户实际发送的UserDAO对象。只要不是从数据库中新检索到的,就会更新此版本,但不会更新原始用户对象。简单传递引用/值错误。

1 个答案:

答案 0 :(得分:0)

数据库所做的修改(如CURRENT_TIMESTAMP或任何类型的触发器)不会被您尝试保存的实体识别。所有修改都必须由java应用程序完成。这样做的正确值是在数据库和实体中,而不进行"刷新"。我使用了以下代码。

[
  {id: 1, childrenIds: [3, 4, 5], name: ""},
  {id: 3, childrenIds: [8, 5], name: ""},
  {id: 21, childrenIds: [ 5], name: ""},
  {id: 7, childrenIds: [5], name: ""},
  {id: 5, childrenIds: [], name: ""}
 ]

数据库列是一个简单的" TIMESTAMP"没有任何进一步的功能。

因此数据库没有任何逻辑,所有这些都是由应用程序在一个地方完成的。该应用程序负责所有修改。通过这种方式维护代码会更容易。