我们知道通过@CreatedBy
注解,能够在实体进行实例化时,自动生成createUser
信息。那么,是否可以在进行实例化时,同时根据生成的createUser
信息,对应生成相应的其它信息呢?
比如:我们现在需要在生成createUser
时,自动生成当前用户所在的部门createDepartment
信息.
解决方案
我们首先想到的是Override
相关方法,比如:setCreateUser
public void setCreateUser(User user) {
this.user = user;
this.department = user.getDepartment();
}
很失望,该方法并没有起作用。这说明,jpa
在处理@CreatedBy
注解时。并未调用setCreateUser()
方法。
接着,查询spring jpa data
官方文档,并没有得到想要的答案。查询hibernate
官方文档 找到如下章节:https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#events-jpa-callbacks
实现
有了方法了,我们尝试进行实践。
@PrePersist
public void setDepartment() {
this.department = this.createUser.getDepartment();
}
测试通过。在进行持久化时,成功的生成了部门信息。
最后,查看引入的注解,竟然发现它一直躺在:javax.persistence
包中。为自己汗颜!
事实再次告诉我:官方文档的学习! JAVA基础的学习! 很重要!
总结
能成功生成的原因猜想:hibernate
先执行了@CreateBy
注解,然后执行了@PrePersist
注解。所以要执行@PrePersist
时,createUser
并不为null
,最后执行成功。
最佳实践告诉我们:我们遇到的问题,其它大牛们早就遇到而且给出了最佳的方案了。我们要做的就是:找到他们!而在相当长的一段时间里(相信99%的程序员会一直处于在这个相当长的时间里),我们都不会成为大牛。所以,我们要提升的永远是:找解决方案的能力!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。