Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate session.getTransaction().commit()如何在不调用getter的情况下知道存在私有字段更改?_Java_Database_Hibernate_Jdbc_Hibernate Mapping - Fatal编程技术网

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

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

如果我通过调用setFirstName(字符串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();
        }
学生班级获得者:

@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等价物)来覆盖此行为

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