Hibernate使用@PrePersist 注解自动生成实体的所属部门
我们知道通过@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%的程序员会一直处于在这个相当长的时间里),我们都不会成为大牛。所以,我们要提升的永远是:找解决方案的能力!