hibernate如何使用no-arg构造函数初始化final字段?

时间:2015-04-14 01:52:07

标签: 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需要一个我提供的无参数构造函数。现在因为字段是final,所以它们必须在构造函数中初始化,所以为了它,我按照代码中所示初始化它们,期望在运行代码时出现一些错误。但是Hibernate用数据库中的字段值形成了对象。这是怎么回事?我需要理解,因为我的应用程序中有一些对象是不可变的。那么,我也应该为他们做同样的事情吗?我看到很多帖子告诉他们提供一个无参数构造函数和Access类型作为不可变对象的字段。但是,当我为final字段提供no-arg构造函数时,必须初始化该字段。所以,我不知道怎么回事?请帮忙。谢谢!

1 个答案:

答案 0 :(得分:3)

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