#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
вызовами или выполните вызовы в разных транзакциях.