在我们的项目中,我们有一部分代码根据传递的对象的类来执行操作。像这样:
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是休眠实体。有时它发生在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存储库中的save或refresh,而某些可能与代理对象一起工作的对象则不会使用未代理的对象
答案 0 :(得分:0)
自从我发布这个问题并且没有任何问题后,我已经广泛地将我的代码与 Hibernate.unproxy 一起使用。
正如评论中所说,Hibernate 可以很好地处理未代理的实体,但如果您取消代理尚未初始化的对象(例如延迟加载的子对象),它可能会触发实体加载。