JPA/Hibernate实例无法正常工作

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

Ben*_*ley 7

这很可能是因为hibernate返回了一个代理.

为什么这样做?要实现延迟加载,框架需要拦截返回延迟加载对象或对象列表的方法调用.它这样做,所以它可以首先从数据库加载对象,然后允许您的方法运行.Hibernate通过创建代理类来实现这一点.如果在debug中检查类型,则应该能够看到实际类型是生成的类,它不会从基类扩展.

怎么绕过它?我有一次这个问题并成功使用访问者模式而不是使用instanceof.它确实增加了额外的复杂性,因此它不是每个人最喜欢的模式,但恕我直言,它比使用更清洁instanceof.

如果您使用,instanceof那么通常最终会使用if...else块来检查不同类型.当您添加更多类型时,您将不得不重新访问每个块.访问者模式的优点是条件逻辑内置于类层次结构中,因此如果添加更多类型,则不太可能需要更改使用这些类的任何位置.

我发现这篇文章在实现访问者模式时很有用.