Hibernate session.getTransaction().commit()如何在不调用getter的情况下知道有私有字段变化?

问题描述 投票:2回答:1

如果我通过调用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;
}
java database hibernate jdbc hibernate-mapping
1个回答
1
投票

我怀疑在 Student 实体 @Id 注释被放在字段上,而不是放在getter上。Smth一样。

@Id
private Long id;

在这种情况下,Hibernate使用了 "基于字段的访问类型",即它直接读取或写入实体的所有字段(通过反射)。所以,在执行dirty check的时候,它只是读取了下面的值。Student 领域(firstName 也)而不使用它们的getters。

你可以通过将 "基于属性 "的访问类型放在 @Id 在 "id "字段的对应getter上。

或者您可以使用 @AttributeAccessor (或相当于JPA的 @Access)来覆盖这种行为。

这2种访问类型各有利弊。阅读更多信息 在文档中.

© www.soinside.com 2019 - 2024. All rights reserved.