【问题标题】:jpa: inheritance with self references and non abstract superclassjpa:具有自引用和非抽象超类的继承
【发布时间】:2012-12-04 17:20:33
【问题描述】:

在我当前的项目中,我有一个如下所示的继承结构:

@Entity
@Table(name="groups")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorValue("G")
@DiscriminatorColumn(name="group_type")
public class Group{  //some annotations removed 
    private Long id;
    private String name;
    private Set<Subject> subjects;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="parent_group_id")
    private Group parent;            #####  tree parent  ####
@OneToMany(cascade=CascadeType.ALL, mappedBy="parent")
    private Set<Group> subGroups;    ##### tree children #####
        ...
}

我的Group 对象可以通过包含其他Group 对象的列表而具有树状结构。 由于有些组有点特殊,所以有第二个类扩展了这个类:

   @Entity
   @DiscriminatorValue("C")
   @Table(name="fix_groups")
   public class FixGroup extends Group{
        private Layout lay;
        private Set<Person> instr;
            ...
    }

我尝试使用联合多表方法(如此处所述:http://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Joined.2C_Multiple_Table_Inheritance),但它似乎不适用于像Group 这样的非抽象超类! 我得到以下异常:

Caused by: java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass 
cannot be cast to org.hibernate.mapping.RootClass

除了将Group 声明为抽象并创建一个仅扩展它的新类Group2 之外,还有其他解决方案吗? 如果我这样做了,这个自我引用Set&lt;Group&gt; subGroups 还会导致问题吗?

【问题讨论】:

    标签: java hibernate jpa persistence javabeans


    【解决方案1】:

    当子类已经映射到父类(在本例中为组)时,我可以通过在子类中设置 ID 来导致此错误。例如在父类中:

    @Entity
    @Table(name="groups")
    @Inheritance(strategy=InheritanceType.JOINED)
    public class Group {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID")
        private Long id;
    ...
    

    然后像这样在子类中设置 id:

    @Entity
    @Table(name="sub_groups")
    public class SubGroup extends Group {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID")
        private Long id;
    ...
    

    此时Group不需要是抽象的,但不能在子类上定义id。

    另外,附带说明一下,如果您使用带有“join”类型继承的 Hibernate,则不需要鉴别器列和值。 Hibernate 仅在使用单个表时使用那些。请参考这篇文章了解更多信息:

    Hibernate 4: persisting InheritanceType.JOINED discriminator column values

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2011-12-28
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多