Hibernate session.getTransaction().commit()如何在不调用getter的情况下知



如果我通过调用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(来覆盖此行为。

这两种访问类型各有利弊。在文档中阅读更多关于它的信息。

最新更新