如何使用鉴别器/继承来管理没有表的空实体和/或实体

时间:2012-02-14 20:44:00

标签: java hibernate spring hibernate-annotations

我曾经在其他网站(和这里)问过几次,但我想我会再试一次,因为我真的没有找到答案。我不熟悉hibernate,我害怕在hibernate的论坛上发帖。我主要使用带有Hibernate 3.6的JPA注释。

我有以下架构: Schema

所以基本上这是一个遗留数据库。提名是中心表,我有4种特定类型的提名:

  1. Coworker(仅使用NOMINATION表列作为属性)
  2. 团队(NOMINATION + TEAM_NOM表)
  3. Idea(NOMINATION + IDEA_NOM表)
  4. 成功(NOMINATION + SUCCESS_NOM表)
  5. 所以我所做的就是使用鉴别器(和继承)来建立它们的实体。例如:

    这是实体提名:

      @Entity(name = "Nomination")
      @Table(name = "NOMINATION")
      @DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1)
      @Inheritance(strategy=InheritanceType.JOINED)
    
      public abstract class Nomination extends AuditableEntity {
    

    以下是我对团队,理念和成功实体的编码方式:

      @Entity(name = "TeamNom")
      @Table(name = "TEAM_NOM")
      @DiscriminatorValue("T")
      @PrimaryKeyJoinColumn(name = "NOM_ID")
    
      public class TeamNom extends Nomination {
    

    现在对于Coworker我做了以下事情:

      @Entity(name = "CoworkerNom")
      @DiscriminatorValue("C")
      @PrimaryKeyJoinColumn(name = "NOM_ID")
    
      public class CoworkerNom extends Nomination {
    

    你可以看到我有一个大问题。 Hibernate正在寻找一个名为“CoworkerNom”的表,但我的数据库中没有任何表。我已经尝试将“提名”作为表格,因为我没有想法,但逻辑上它给了我循环依赖性错误。

    那么我如何处理没有表格和没有属性的实体呢?其他实体显然工作正常。

1 个答案:

答案 0 :(得分:1)

在hibernate中你将不得不创建一个包含每个提名子类属性的表,所以你将在实践中使用这个表只填充ID ...我认为这背后的基本原理是这样的你具有以下优点:如果您希望将来使用特定属性扩展此子类,则可以在不需要更多注释或架构更改的情况下执行此操作。