2

我们知道通过@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包中。为自己汗颜!

clipboard.png

事实再次告诉我:官方文档的学习! JAVA基础的学习! 很重要!

总结

能成功生成的原因猜想:
hibernate先执行了@CreateBy注解,然后执行了@PrePersist注解。所以要执行@PrePersist时,createUser并不为null,最后执行成功。

最佳实践告诉我们:我们遇到的问题,其它大牛们早就遇到而且给出了最佳的方案了。我们要做的就是:找到他们!而在相当长的一段时间里(相信99%的程序员会一直处于在这个相当长的时间里),我们都不会成为大牛。所以,我们要提升的永远是:找解决方案的能力!


潘杰
3.1k 声望239 粉丝

引用和评论

0 条评论