如果我通过调用setFirstName(StringnewFirstName(来更改firstName值,然后用session.getTransaction((.commit((提交数据,一切都很好,但Hibernate如何在不调用Student类中的getFirstName的情况下知道新的Student名字?
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上,可以将此行为更改为"基于属性"的访问类型。
或者,您可以使用@AttributeAccessor(或其JPA的等价物@Access(来覆盖此行为。
这两种访问类型各有利弊。在文档中阅读更多关于它的信息。