我有一些类型的架构师(?)问题
我开发了一个基于Spring和Hibernate的应用程序(带注释的配置) 对于我的数据库中的每个表,我添加了4个字段:createdBy和modifiedBy(String),创建和修改(Datetime)。每个实体类也分别具有此字段和getter / setter对。因此,我希望找到填写此字段的最佳实践解决方案,而不是为每个DAO额外代码添加。有可能吗?
我会对任何提案感到高兴
答案 0 :(得分:3)
当然可以。只需将此代码添加到所有持久实例的基类中,并启用注释处理:
@PrePersist
public void prePersist()
{
if (created == null)
{
created = updated = createCurrentTimestamp();
createdBy = updatedBy = CurrentUser.get();
}
}
@PreUpdate
public void preUpdate()
{
updated = createCurrentTimestamp();
updatedBy = CurrentUser.get();
}
public static java.sql.Timestamp createCurrentTimestamp ()
{
final long now = System.currentTimeMillis();
final java.sql.Timestamp ts = new java.sql.Timestamp (now);
ts.setNanos(((int)(now % 1000)) * 1000000);
return ts;
}
CurrentUser
是ThreadLocal<String>
,它允许我在操作开始时指定用户启动它。这样,任何被触摸的对象都将包含正确的信息。
如果没有注释处理,请激活HBM文件中的相应选项。
答案 1 :(得分:0)
看看Spring AOP。
您可以为DAO方法分配“拦截器”,以便首先由拦截器处理对象,然后执行进入DAO方法。
在拦截器中,您可以使用所需的数据填充对象。
答案 2 :(得分:0)
一种可能性是定义一个Hibernate EventListener,它可以在每个实体刷新到数据库之前填写这些字段