hibernate 如何使用无参数构造函数初始化最终字段?
How hibernate is initializing final fields using the no-arg constructor?
所以,我有这个 class,我正尝试将其与 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 类型作为不可变对象的字段。但是,当我为 final 字段提供无参数构造函数时,必须初始化该字段。所以,我不明白这里发生了什么?请帮忙。谢谢!
Hibernate 使用反射(或一些相关的低级技巧)来设置私有实例字段。该方法还可以绕过 final
(即在构造函数 returns 之后重新分配新值)。
所以,我有这个 class,我正尝试将其与 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 类型作为不可变对象的字段。但是,当我为 final 字段提供无参数构造函数时,必须初始化该字段。所以,我不明白这里发生了什么?请帮忙。谢谢!
Hibernate 使用反射(或一些相关的低级技巧)来设置私有实例字段。该方法还可以绕过 final
(即在构造函数 returns 之后重新分配新值)。