【问题标题】:Does Hibernate.unproxy have any side effects?Hibernate.unproxy 有副作用吗?
【发布时间】:2019-09-18 12:50:18
【问题描述】:

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

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 并且可以与代理对象一起使用的东西不使用未经代理的对象)

【问题讨论】:

  • AFAIK Hibernate 仍然能够处理您提供给它的未代理实体,并且实际上某些查询只会返回未代理实体(也取决于您的映射)。取消代理实体既不会更改实体也不会更改代理,它只会返回代理内“打包”的实体。但是可能发生的一件事是,如果代理将引用尚未初始化的对象,则该实体将被加载(即延迟加载)。欲了解更多信息,请查看此处:vladmihalcea.com/…

标签: java hibernate proxy-object


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2018-02-14
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多