Hibernate.unproxy 有副作用吗?
Does Hibernate.unproxy have any side effects?
在我们的项目中,我们有一部分代码根据传递的对象的 class 执行操作。像这样:
public class A { }
public class B extends A { }
public class Manager {
public void manageA(A obj) {
if(A.class.equals(obj.getClass()) {
//do stuff
} else if(B.class.equals(obj.getClass()) {
//do other stuff
}
}
}
现在,A 和 B 是 Hibernate 实体。有时会发生这种情况,方法 manageA 接收到一个代理对象,但它无法按照其实现的方式执行操作。所以我们添加了一个 Hibernate.unproxy
来获取未代理的对象。
public void manageA(A obj) {
obj = (A) Hibernate.unproxy(obj);
if(A.class.equals(obj.getClass()) {
//do stuff
} else if(B.class.equals(obj.getClass()) {
//do other stuff
}
}
但我担心这可能会产生一些副作用,即可以与代理对象一起使用的东西不再起作用。我注意到,通过调试,当取消对对象的代理时,我丢失了 "handler" 属性(来自 Hibernate),但我不知道它做了什么,或者 Hibernate 是否仍然以其他方式处理它的东西。
我知道我可以做到这一点
public void manageA(A obj) {
Class<? extends A> clazz = (A) Hibernate.unproxy(obj).getClass();
if(A.class.equals(clazz) {
//do stuff
} else if(B.class.equals(clazz) {
//do other stuff
}
}
保持代理对象不变。但我认为解除 Hibernate 对象的代理是否有一些副作用,这是未来值得了解的事情。
值得一提的是,我不害怕方法外部发生的事情,而是方法本身内部可能发生的事情(假设它从 Spring Data JPA 存储库调用保存或刷新以及一些可以工作的东西使用代理对象不适用于未代理对象)
自从我发布这个问题以来,我已经在 Hibernate.unproxy 中广泛使用了我的代码,并且没有任何问题。
如评论中所述,Hibernate 可以很好地处理未代理的实体,但如果您取消代理尚未初始化的对象(如延迟加载的子对象),它可能会触发实体加载。
在我们的项目中,我们有一部分代码根据传递的对象的 class 执行操作。像这样:
public class A { }
public class B extends A { }
public class Manager {
public void manageA(A obj) {
if(A.class.equals(obj.getClass()) {
//do stuff
} else if(B.class.equals(obj.getClass()) {
//do other stuff
}
}
}
现在,A 和 B 是 Hibernate 实体。有时会发生这种情况,方法 manageA 接收到一个代理对象,但它无法按照其实现的方式执行操作。所以我们添加了一个 Hibernate.unproxy
来获取未代理的对象。
public void manageA(A obj) {
obj = (A) Hibernate.unproxy(obj);
if(A.class.equals(obj.getClass()) {
//do stuff
} else if(B.class.equals(obj.getClass()) {
//do other stuff
}
}
但我担心这可能会产生一些副作用,即可以与代理对象一起使用的东西不再起作用。我注意到,通过调试,当取消对对象的代理时,我丢失了 "handler" 属性(来自 Hibernate),但我不知道它做了什么,或者 Hibernate 是否仍然以其他方式处理它的东西。
我知道我可以做到这一点
public void manageA(A obj) {
Class<? extends A> clazz = (A) Hibernate.unproxy(obj).getClass();
if(A.class.equals(clazz) {
//do stuff
} else if(B.class.equals(clazz) {
//do other stuff
}
}
保持代理对象不变。但我认为解除 Hibernate 对象的代理是否有一些副作用,这是未来值得了解的事情。
值得一提的是,我不害怕方法外部发生的事情,而是方法本身内部可能发生的事情(假设它从 Spring Data JPA 存储库调用保存或刷新以及一些可以工作的东西使用代理对象不适用于未代理对象)
自从我发布这个问题以来,我已经在 Hibernate.unproxy 中广泛使用了我的代码,并且没有任何问题。
如评论中所述,Hibernate 可以很好地处理未代理的实体,但如果您取消代理尚未初始化的对象(如延迟加载的子对象),它可能会触发实体加载。