0

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

@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<Group> subGroups还会引起问题吗?

4

1 回答 1

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:持久化 InheritanceType.JOINED 鉴别器列值

于 2012-12-04T21:07:16.140 回答