Hibernate.unproxy有副作用吗?

时间:2019-09-18 12:50:18

标签: java hibernate proxy-object

在我们的项目中,我们有一部分代码根据传递的对象的类来执行操作。像这样:

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,而某些可能与代理对象一起工作的对象则不会使用未代理的对象

1 个答案:

答案 0 :(得分:0)

自从我发布这个问题并且没有任何问题后,我已经广泛地将我的代码与 Hibernate.unproxy 一起使用。

正如评论中所说,Hibernate 可以很好地处理未代理的实体,但如果您取消代理尚未初始化的对象(例如延迟加载的子对象),它可能会触发实体加载。