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