【发布时间】: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