如果我通过调用setFirstName(String newFirstName)来改变firstName的值,然后用session.getTransaction().commit()来提交数据,一切都很正常,但是Hibernate如何在没有调用学生类中的getFirstName()的情况下知道新的学生名字呢?
Session session = sessionFactory.getCurrentSession();
try{
session.beginTransaction();
Student student = session.get(Student.class, 1);
student.setFirstName("Michael");
session.getTransaction().commit();
}
学生类的getter。
@Column(name = "first_name")
private String firstName;
public String getFirstName() {
System.out.println("Getting first name: "+firstName); //never printed
return firstName;
}
我怀疑在 Student
实体 @Id
注释被放在字段上,而不是放在getter上。Smth一样。
@Id
private Long id;
在这种情况下,Hibernate使用了 "基于字段的访问类型",即它直接读取或写入实体的所有字段(通过反射)。所以,在执行dirty check的时候,它只是读取了下面的值。Student
领域(firstName
也)而不使用它们的getters。
你可以通过将 "基于属性 "的访问类型放在 @Id
在 "id "字段的对应getter上。
或者您可以使用 @AttributeAccessor (或相当于JPA的 @Access)来覆盖这种行为。
这2种访问类型各有利弊。阅读更多信息 在文档中.