Как Hibernate session.getTransaction (). Commit () знает, что есть изменения частного поля без вызова getter? - PullRequest
2 голосов
/ 02 мая 2020

Если я изменяю значение firstName, вызывая setFirstName (String newFirstName), а затем фиксирую данные с помощью session.getTransaction (). Commit (), все работает нормально, но как Hibernate узнает имя нового ученика без вызова 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;
}

1 Ответ

1 голос
/ 02 мая 2020

Я подозреваю, что в сущности Student аннотация @Id размещается на поле, а не на получателе. Что-то вроде:

@Id
private Long id;

В этом случае Hibernate использует «тип доступа на основе полей», то есть он читает или записывает все поля объекта напрямую (через отражение). Таким образом, при выполнении грязной проверки он просто читает значения полей Student (тоже firstName) без использования их получателей.

Вы можете изменить это поведение на тип доступа "на основе свойств", поместив @Id на соответствующем получателе поля «id».

Или вы можете использовать @ AttributeAccessor (или его эквивалент JPA - @ Access ), чтобы переопределить это поведение.

Есть плюсы и минусы эти 2 типа доступа. Подробнее об этом в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...