Java Hibernate和Mysql对象不刷新时间戳列
我目前正在用spring、hibernate和mysql开发一个web应用程序。 问题是向所有对象添加一个创建的时间戳和更新的时间戳 我有以下抽象@MappedSuperClass:Java Hibernate和Mysql对象不刷新时间戳列,java,mysql,spring,hibernate,timestamp,Java,Mysql,Spring,Hibernate,Timestamp,我目前正在用spring、hibernate和mysql开发一个web应用程序。 问题是向所有对象添加一个创建的时间戳和更新的时间戳 我有以下抽象@MappedSuperClass: @MappedSuperclass public abstract class AbstractTimestampEntity { @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_at", nullable = false)
@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中,定义了创建时的当前时间戳和更新时的当前时间戳更新时的当前时间戳
当我手动测试它时,在插入一个对象并在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对象扩展了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的设置值:
日期:{更新日期:2017-01-06 12:25:59.0}
为什么它不把它写在对象中?而且它不会给出任何类型不匹配或类似的错误。@Temporal(TemporalType.TIMESTAMP)是否没有从sql.TIMESTAMP转换为util.Date
问候
更新:
我通过将对象传递给userResource得到了错误,我构造了一个UserDAO对象,该对象是用户实际发送的。只要不是从数据库中新检索到的,这个对象将得到更新,但不是原始用户对象。简单的按引用传递/值错误。试图保存的实体无法识别数据库所做的修改(如当前时间戳或任何类型的触发器)。所有修改都必须由java应用程序进行。这样,正确的值就在数据库和实体中,而无需进行“刷新”。我使用了以下代码
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@Version
private Date updated_at;
数据库列是一个简单的“时间戳”,没有任何进一步的功能
因此,数据库没有任何逻辑,所有操作都由应用程序在一个地方完成。应用程序负责所有修改。这样维护代码会更容易 尝试对
java.sql.Timestamp
字段使用javax.persistence.Version
注释。我也不确定字段上的updateable=false
是否会导致问题,但您并不真正需要它。我尝试了@Version@Column(name=“updated_at”,nullable=false,updateable=false)私有时间戳updated代码>它仍然得到相同的错误。我之所以设置updateable=false
是因为我传递的值不为null时mysql没有更新。好的,我可以将功能移动到应用程序,这可能是更好的方法。(希望使用PrePersist
和PreUpdate
但在使用会话API时不起作用)但是,它应该仍然可以这样工作,因为我刷新了从数据库检索新数据的实体,并且应该包括从Mysql生成的时间戳否?是否有“提交”命令?可能mysql在提交之前设置了时间戳。如果我解释正确,更新或刷新时应该是“提交”的。我不知道mysql何时设置时间戳,但提交后必须设置时间戳。这就是为什么,我建议测试时间戳是否在提交之后设置。只是想看看有无提交之间是否有区别。我用sessionFactory.getCurrentSession().createSQLQuery(“提交;”)进行了尝试添加和更新后的代码>,但它不会更改空指针异常。仍然无法刷新实体..mhh