У меня проблема с ленивой загрузкой в спящем режиме при работе с наследованием. У меня есть одна сущность, которая ссылается на второй объект, который является подклассом. Я хочу, чтобы ссылка лениво загружалась, но это вызывает ошибки в моих методах .equals().Hibernate Lazy Загрузка, прокси и наследование
В приведенном ниже коде, если вы вызываете equals() в экземпляре A, проверка не выполняется в функции C.equals() при проверке, является ли Object o экземпляром C. Он терпит неудачу, потому что другой объект на самом деле является прокси-сервером Hibernate, созданным javassist, который расширяет B, а не C.
Я понимаю, что Hibernate не может создать прокси типа C без перехода в базу данных и, таким образом, сломать ленивую загрузку. Есть ли способ заставить функцию getB() в классе A возвращать конкретный экземпляр B вместо прокси (лениво)? Я попытался использовать аннотацию @LazyToOne (LazyToOneOption.NO_PROXY) Hibernate для метода getB() безрезультатно.
@Entity @Table(name="a")
public class A {
private B b;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="b")
public B getB() {
return this.b;
}
public boolean equals(final Object o) {
if (o == null) {
return false;
}
if (!(o instanceof A)) {
return false;
}
final A other = (A) o;
return this.getB().equals(o.getB());
}
}
@Entity @Table(name="b")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="type",
discriminatorType=DiscriminatorType.STRING
)
public abstract class B {
private long id;
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof B)) {
return false;
}
final B b = (B) o;
return this.getId().equals(b.getId());
}
}
@Entity @DiscriminatorValue("c")
public class C extends B {
private String s;
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (obj == null) {
return false;
}
if (!super.equals(obj)) {
return false;
}
if (!(obj instanceof C)) {
return false;
}
final C other = (C) o;
if (this.getS() == null) {
if (other.getS() != null) {
return false;
}
} else if (!this.getS().equals(other.getS())) {
return false;
}
return true;
}
}
@Entity @DiscriminatorValue("d")
public class D extends B {
// Other implementation of B
}
Существует опция использования NO_PROXY и инструментария. Вы можете открыть «это» вне объекта и использовать его для проверки instanceof. В «этом» у вас всегда будет развернутый и уже инициализированный объект. Вот мое подробное решение http://lifeinide.com/post/2017-05-28-hibernate-single-side-associations-lazy-fetch/ –