Java Hibernate session.getTransaction().commit()如何在不调用getter的情况下知道存在私有字段更改?
如果我通过调用setFirstName(字符串newFirstName)来更改firstName值,然后使用session.getTransaction().commit()提交数据,一切都正常,但是Hibernate如何在不调用学生类中的getFirstName()的情况下知道新的学生名呢Java Hibernate session.getTransaction().commit()如何在不调用getter的情况下知道存在私有字段更改?,java,database,hibernate,jdbc,hibernate-mapping,Java,Database,Hibernate,Jdbc,Hibernate Mapping,如果我通过调用setFirstName(字符串newFirstName)来更改firstName值,然后使用session.getTransaction().commit()提交数据,一切都正常,但是Hibernate如何在不调用学生类中的getFirstName()的情况下知道新的学生名呢 Session session = sessionFactory.getCurrentSession(); try{ session.beginTr
Session session = sessionFactory.getCurrentSession();
try{
session.beginTransaction();
Student student = session.get(Student.class, 1);
student.setFirstName("Michael");
session.getTransaction().commit();
}
学生班级获得者:
@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使用“基于字段的访问类型”,即它直接读取或写入实体的所有字段(通过反射)。因此,在执行脏检查时,它只读取Student
字段的值(firstName
),而不使用它们的getter
通过将@Id
放置在“Id”字段的相应getter上,可以将此行为更改为“基于属性”的访问类型
或者您可以使用(或其JPA等价物)来覆盖此行为
这两种访问类型各有利弊。阅读更多关于它的信息