Сопоставление Hibernate @oneToOne не может использовать кеш L2, когда сопоставление не возвращает объектJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Сопоставление Hibernate @oneToOne не может использовать кеш L2, когда сопоставление не возвращает объект

Сообщение Anonymous »

У меня есть 2 класса JPA с двунаправленным сопоставлением onetoOne:

Код: Выделить всё

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Person {

@Column(name = "\"Name\"")
private String name;

// bi-directional one-to-one association to CarDetails
@OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "owner")
private CarDetails carDetails;

public String getName() {
return this.name;
}

public void setName(String name) {
return this.name=name;
}

public CarDetails getCarDetails() {
return this.carDetails;
}

public CarDetails setCarDetails(CarDetails carDetails) {
if (carDetails == null) {
if (this.carDetails != null) {
this.carDetails.setOwner(null);
}
}
else {
carDetails.setOwner(this);
}
this.carDetails = carDetails;
return this;
}

}

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class CarDetails {

@Column(name = "\"RegistrationNumber\"")
private String registrationNumber;

// bi-directional one-to-one association to Person
@OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
private Person owner;

public String getRegistrationNumber() {
return this.registrationNumber;
}

public void setRegistrationNumber(String registrationNumber) {
return this.registrationNumber=registrationNumber;
}

public Person getOwner() {
return this.owner;
}

public void setOwner(Person owner) {
this.owner = owner;
}

}
Я включил кеш L2 для Hibernate, а также включил журналы sql hibernate, чтобы увидеть, какие запросы выполняются к БД, используя: Я использую em.find() для Person и ожидаю, что как только сущность person будет возвращена, carDetails также будет кэшироваться в кеше L2, и запросы больше не будут создаваться, поскольку мы получим попадания в кеш. Но в случае, когда у человека нет автомобилей, я вижу, что каждый раз, когда я обращаюсь к carDetails, к БД запускается новый запрос вместо сохранения того, что данные carDetails не были возвращены ранее.
Я также читаю hibernate-docs-collection-cache, поскольку коллекции не кэшируются автоматически, я тоже пробовал:

Код: Выделить всё

    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
// bi-directional one-to-one association to CarDetails
@OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "owner")
private CarDetails carDetails;
При этом отношения должны кэшироваться, но я все равно вижу, что запрос попадает в БД в журналах спящего режима. Есть ли способ это исправить?

Подробнее здесь: https://stackoverflow.com/questions/798 ... urns-no-ob
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»