Hibernate session.getTransaction().commit() 如何在不调用 getter 的情况下知道私有字段发生变化?
How Hibernate session.getTransaction().commit() knows there are private field changes without calling getter?
如果我通过调用 setFirstName(String newFirstName) 更改 firstName 值,然后使用 session.getTransaction().commit() 提交数据,一切正常,但是 Hibernate 如何在不调用 getFirstName( ) 在学生 class ?
Session session = sessionFactory.getCurrentSession();
try{
session.beginTransaction();
Student student = session.get(Student.class, 1);
student.setFirstName("Michael");
session.getTransaction().commit();
}
学生classgetter:
@Column(name = "first_name")
private String firstName;
public String getFirstName() {
System.out.println("Getting first name: "+firstName); //never printed
return firstName;
}
我怀疑在 Student
实体中,@Id
注释被放置在字段上而不是 getter 上。像:
@Id
private Long id;
在这种情况下,Hibernate 使用 "field-based access type",即它直接读取或写入实体的所有字段(通过反射)。因此,在执行脏检查时,它只读取 Student
字段的值(firstName
也是),而不使用它们的 getters.
您可以将此行为更改为 "property-based" 访问类型,方法是将 @Id
放置在 "id" 字段的相应 getter 上。
或者您可以使用 @AttributeAccessor (or its JPA's equivalent - @Access) 覆盖此行为。
这两种访问类型各有利弊。阅读更多相关信息 in the docs。
如果我通过调用 setFirstName(String newFirstName) 更改 firstName 值,然后使用 session.getTransaction().commit() 提交数据,一切正常,但是 Hibernate 如何在不调用 getFirstName( ) 在学生 class ?
Session session = sessionFactory.getCurrentSession();
try{
session.beginTransaction();
Student student = session.get(Student.class, 1);
student.setFirstName("Michael");
session.getTransaction().commit();
}
学生classgetter:
@Column(name = "first_name")
private String firstName;
public String getFirstName() {
System.out.println("Getting first name: "+firstName); //never printed
return firstName;
}
我怀疑在 Student
实体中,@Id
注释被放置在字段上而不是 getter 上。像:
@Id
private Long id;
在这种情况下,Hibernate 使用 "field-based access type",即它直接读取或写入实体的所有字段(通过反射)。因此,在执行脏检查时,它只读取 Student
字段的值(firstName
也是),而不使用它们的 getters.
您可以将此行为更改为 "property-based" 访问类型,方法是将 @Id
放置在 "id" 字段的相应 getter 上。
或者您可以使用 @AttributeAccessor (or its JPA's equivalent - @Access) 覆盖此行为。
这两种访问类型各有利弊。阅读更多相关信息 in the docs。