在我们的项目中,我们有一部分代码根据传递的对象的类来执行操作。像这样的东西:
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 并且可以与代理对象一起使用的东西不适用于未代理的对象)