gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 19:37:23 26 4
gpt4 key购买 nike

我目前正在使用 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));

这将导致空指针异常,因为 tester1 对象的日期从未设置。 (Tester1 对象扩展了 AbstractTimestampEntity)

我使用 sql 查询手动检索日期:

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 对象,从而得到了错误。只要不是从数据库中新检索到的,该对象就会被更新,但原始的用户对象不会被更新。简单的引用/值传递错误。

最佳答案

您尝试保存的实体无法识别数据库所做的修改(例如 CURRENT_TIMESTAMP 或任何类型的触发器)。所有修改都必须由 java 应用程序进行。这样做,正确的值将存在于数据库和您的实体中,而无需执行“刷新”。我使用了以下代码。

@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@Version
private Date updated_at;

数据库列是一个简单的“TIMESTAMP”,没有任何其他功能。

所以数据库没有任何逻辑,所有的事情都是由应用程序在一处完成的。应用程序负责所有修改。这样维护你的代码会更容易。

关于java - Hibernate和Mysql对象不刷新时间戳列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com