非常愚蠢的问题,因为我已经使用hibernate一段时间了但是我遇到了一个特殊情况,突然意识到我不确定hibernate如何填充数据库实体。
public class User {
...
@Column
private String name;
public void setName(String name) {
this.name = name;
}
}
当hibernate创建User的新实例时(从DB加载时),它将如何填充该实例的属性名称?我总是假设hibernate会为此调用setName但是我遇到的情况让我怀疑hibernate忽略了setter并且(用反射)直接设置了字段的值?
感谢,
斯泰恩
答案 0 :(得分:5)
访问属性允许您 控制Hibernate如何访问 运行时的属性。默认情况下, Hibernate将调用该属性 获取/设置对。如果你指定 access =“field”,Hibernate会绕过 获取/设置对并访问该字段 直接使用反射。您可以 指定你自己的财产策略 通过命名一个类来访问 实现接口 org.hibernate.property.PropertyAccessor。
access="field|property|ClassName"
答案 1 :(得分:5)
Hibernate注释和JPA使用Annotation的放置来确定要使用的访问类型。在上面提供的示例中,它将使用字段访问。
来自Hibernate Annotations documentation:
根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。 EJB3规范要求您在将要访问的元素类型上声明注释,即如果使用属性访问则使用getter方法,如果使用字段访问,则为字段。应避免在两个领域和方法中混合注释。
答案 2 :(得分:1)
hibernate默认使用反射属性访问 如果您需要更多详细信息,我建议您查看系统安全策略(SecurityManager)