java - hibernate 如何使用无参数构造函数初始化最终字段?

标签 java hibernate immutability

所以,我尝试将这个类与 Hibernate 一起使用:

@Entity
@Access(AccessType.FIELD)
public class BasicUser {

    @Id 
    private final int userId;
    private final String userName;

    BasicUser(int userId, String userName) {
        super();
        this.userId = userId;
        this.userName = userName;
    }


    BasicUser() {
        super();
        this.userId=0;
        this.userName=null;
    }
    //getters

}

我尝试从数据库中提取 userId 和 userName 并创建一个 BasicUser 对象,效果很好。但是,我不明白它是如何工作的? Hibernate 需要一个我提供的无参数构造函数。现在,由于这些字段是最终字段,因此必须在构造函数中初始化它们,因此我按照代码中所示初始化了它们,预计在运行代码时会出现一些错误。但 Hibernate 使用数据库中的字段值形成对象。这是怎么发生的?我需要理解,因为我的应用程序中有一些不可变的对象。那么,我也应该为他们做同样的事情吗?我看到很多帖子告诉我们提供无参数构造函数和 Access 类型作为不可变对象(immutable对象)的字段。但是,当我为最终字段提供无参数构造函数时,必须初始化该字段。所以,我不明白这里发生了什么?请帮忙。谢谢!

最佳答案

Hibernate 使用反射(或一些相关的低级技巧)来设置私有(private)实例字段。该方法还可以绕过 final (即在构造函数返回后重新分配新值)。

关于java - hibernate 如何使用无参数构造函数初始化最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29617895/

相关文章:

java - 用java生成柱形图

Netbean GUI selectall 操作中的 Java 弹出菜单

java - MySQL - 必须被捕获或声明被抛出

java - Hibernate 映射列表 - 索引

java - 如何从类级别注释违规中获取属性路径

java - HibernateJPAVendorAdapter 和 JPAProperty 中的属性之间的优先级

java - RestEASY 拦截器未被调用

javascript - ImmutableJS - 插入嵌套数组

java - 如何使 2D ArrayList 不可变?

c# - 深度不可变类型的惰性初始化是否需要锁?