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ます。一部のグループは少し特殊なので、このクラスを拡張する 2 番目のクラスがあります。

   @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 が親クラス (この場合はグループ) に既にマップされている場合に、サブクラスに 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 を使用している場合は、識別子の列と値は必要ありません。Hibernate は、単一のテーブルを使用する場合にのみそれらを利用します。詳細については、この投稿を参照してください。

Hibernate 4: InheritanceType.JOINED 識別子列の値を永続化する

于 2012-12-04T21:07:16.140 に答える