当前位置: 首页 > 面试题库 >

Hibernate Polymorphism.EXPLICIT注释不起作用?

丌官招
2023-03-14
问题内容

我知道有一些关于此的帖子,但是它们大约一年了,没有任何回应。实际上,我们在PostgreSQL 8.4上使用的是Hibernate
4.2.1.Final。我们有两个这样的实体

实体A(顶级层次结构类)

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Polymorphism(type = PolymorphismType.EXPLICIT)
public class A {
    @Id
    @GeneratedValue
    private Long id;

    public A() {

    }

    public A(Long id) {
        super();
        this.id = id;
    }

    // Setters, getteres, hashCode and equals
}

实体B(子类)

@Entity
public class B extends A{
    String value;

    public B(){

    }

    public B(String value) {
        super();
        this.value = value;
    }

    public B(Long id, String value) {
        super(id);
        this.value = value;
    }

    // Setters, getteres, hashCode and equals
}

如您所见,使用注释了一个实体,PolymorphismType.EXPLICIT但是当使用来获取顶级类时

ArrayList<A> lista = (ArrayList<A>) session.createCriteria(A.class).list();

我们也通过String value属性获得了B子类。实际上,SQL语句包含left outer join B。这仍然是Hibernate第四版中的错误,还是我做错了什么?

最好的祝福


问题答案:

我认为相关文档和功能本身非常令人困惑。从第5章开始:

显式多态性意味着类实例将仅由显式命名该类的查询返回。

这将向我表明您的查询 应该 有效。但是,您尝试做的事情似乎并不是他们的意图,正如您在同一段的后面可以看到的那样:

当两个不同的类映射到同一张表时,显式多态性很有用。这允许包含表列子集的“轻量级”类。

他们在这里谈论的是具有BA映射到同一张表,但没有实际的类关系。您可以在JIRA的旧机票中看到这种观点。我猜这意味着,如果它们没有类关系,但是在同一个表中,则可以使用IMPLICIT多态性通过相同的查询来获取两者,但是鉴于它们不共享Java子类,这似乎完全是奇怪的。

因此,总结是,PolymorphismType.EXPLICIT它并没有实现您认为的那样。我认为,根据上面的第一个引用,它 应该 可以满足您的期望。



 类似资料:
  • 我有一个简单的类叫BeaconDao 然而,当我用@service或@component标记beaconDao时,一切都运行得非常好。有人能看出问题所在吗?

  • 问题内容: 我正在尝试使用Java批注,但似乎无法使我的代码认识到其中存在。我究竟做错了什么? 问题答案: 您需要使用注释界面上的@Retention注释将注释指定为运行时注释。 即

  • 问题内容: 我从Spring Framework开始,想做一个带有注释的HelloWorld,我已经创建了一个控制器和一个视图,我猜它是基本的hello工作。但是,我想使用注释,因为我不能再使用SimpleFormController(已弃用)。 我收到的错误是Estado HTTP 404-/av/index.jsp 我正在使用Netbeans,并将示例基于它提供的基本模板。我有以下文件,我可以

  • 我尝试使用SmtpAuthenticator创建邮件服务。组件已正确启动,但用户名和密码字段中存在空值。为什么会这样?

  • 我尝试使用Spring security 3.1 但当我ROLE_USER权限 和控制程序代码