我在處理繼承時遇到了休眠中延遲加載的問題。我有一個實體引用了第二個子類的實體。我想要引用來加載懶惰,但這會導致我的.equals()方法中出現錯誤。休眠惰性加載,代理和繼承
在下面的代碼中,如果在A的實例上調用equals(),則在檢查Object o是否爲C的實例時,檢查在C.equals()函數中失敗。它因爲另一個對象實際上是由javassist創建的Hibernate代理,它擴展了B,而不是C.
我知道Hibernate無法創建類型C的代理而無需轉到數據庫,從而打破延遲加載。有沒有辦法讓類A中的getB()函數返回具體的B實例而不是代理(懶惰)?我試過在getB()方法上使用特定於Hibernate的@LazyToOne(LazyToOneOption.NO_PROXY)註解無濟於事。
@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和儀器。你可以在對象之外暴露「this」並用它來檢查instanceof。在「這個」中,你總是會打開並且已經初始化的對象。這裏是我的詳細解決方案http://lifeinide.com/post/2017-05-28-hibernate-single-side-associations-lazy-fetch/ – 2017-05-28 11:50:54