Dmi*_*rov 0 java hibernate jpa
想象一下情况:
@javax.persistence.Inheritance(strategy=javax.persistence.InheritanceType.JOINED)
@javax.persistence.DiscriminatorColumn
@javax.persistence.Entity
@javax.persistence.Table(name="PARENT")
public abstract class Parent{
...
}
@javax.persistence.Entity
@javax.persistence.Table(name="A")
public class A extends Parent{
...
}
@javax.persistence.Entity
@javax.persistence.Table(name="B")
public class B extends Parent{
...
}
Parent p = new A();
Run Code Online (Sandbox Code Playgroud)
现在我们称之为:
p instance of A
Run Code Online (Sandbox Code Playgroud)
总是返回false !!
在OpenJPA上运行正常!
我应该提交错误吗?Hibernate 4.3.10
这很可能是因为hibernate返回了一个代理.
为什么这样做?要实现延迟加载,框架需要拦截返回延迟加载对象或对象列表的方法调用.它这样做,所以它可以首先从数据库加载对象,然后允许您的方法运行.Hibernate通过创建代理类来实现这一点.如果在debug中检查类型,则应该能够看到实际类型是生成的类,它不会从基类扩展.
怎么绕过它?我有一次这个问题并成功使用访问者模式而不是使用instanceof.它确实增加了额外的复杂性,因此它不是每个人最喜欢的模式,但恕我直言,它比使用更清洁instanceof.
如果您使用,instanceof那么通常最终会使用if...else块来检查不同类型.当您添加更多类型时,您将不得不重新访问每个块.访问者模式的优点是条件逻辑内置于类层次结构中,因此如果添加更多类型,则不太可能需要更改使用这些类的任何位置.
我发现这篇文章在实现访问者模式时很有用.
| 归档时间: |
|
| 查看次数: |
1721 次 |
| 最近记录: |