Чтение @переходных полей из базы данных

#spring #spring-boot #spring-data-jpa

#весна #весна-загрузка #весна-данные-jpa

Вопрос:

У меня есть приложение spring boot с базой данных и объектом с полем @Transcient … вот пример кода:

 @Entity
@Table(name = "dogs")
@JsonInclude(Include.NON_NULL)
@ApiModel
public class Dog {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    
    @Transient
    public Boolean happy;
}

Dog dog1 = dogsRepository.findById(1);
dog1.setHappy(true);

Dog dog2 = dogsRepository.findById(1);
System.out.println("dog2 is happy = "   dog2.isHappy());
  

и последняя строка выводится dog2 is happy = true на экран. Как это возможно? поля @Transient не сохраняются в базе данных.

Комментарии:

1. Он извлекается не из базы данных, а из кэша первого уровня.

2. Кэш первого уровня JPA?

Ответ №1:

Метод dogsRepository.findById проверяет кэш 1-го уровня. Если он не может быть найден там, он будет извлечен из базы данных и сохранен в кэше 1-го уровня. Вот почему 2-й вызов findById будет извлекать его не из базы данных, а из кэша. Вот почему dog1 и dog2 в вашем случае являются одним и тем же объектом.

Этого не произойдет, например, если вы очистите кэш между findById вызовами или выполните вызовы в разных транзакциях.