在我当前的项目中,我有一个如下所示的继承结构:
@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
是否会引起问题?
答案 0 :(得分:1)
当能够在子类中映射(在本例中为Group)时,我可以通过设置子类中的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。
另外,作为旁注,如果您使用的Hibernate具有“join”类型的继承,则不需要鉴别器列和值。如果使用单个表,Hibernate仅使用它们。请参阅这篇文章以获取更多信息:
Hibernate 4: persisting InheritanceType.JOINED discriminator column values