2

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

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
        }
    }

但是我担心这可能会产生一些副作用,即可以与代理对象一起使用的东西不再起作用。我注意到,通过调试,当取消代理对象时,我失去了“处理程序”属性(来自 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 并且可以与代理对象一起使用的东西不适用于未代理的对象)

4

1 回答 1

0

自从我发布这个问题以来,我已经在 Hibernate.unproxy 中广泛使用了我的代码并且没有任何问题。

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

于 2021-02-26T09:15:18.563 回答