2017-01-18 19 views
1

Hibernateで継承を達成しようとしています。Hibernate継承、親クラスはデシリアに基づいて子または親である必要があります

  • 決定者が 'K' である場合は、4:

    後は

    //Grand Parent Class 
    @Entity 
    @Table(name="grand_parent") 
    public class GrandParent{//consider @id} 
    
    //Parent Class 
    @Entity 
    @Table(name = "parent") 
    @Inheritance(strategy = InheritanceType.JOINED) 
    @DiscriminatorColumn(name = "decider", discriminatorType = DiscriminatorType.STRING) 
    public class Parent{//consider @id} 
    
    //ChildX class 
    @Entity 
    @Table(name = "childX") 
    @PrimaryKeyJoinColumn(name="id") 
    @DiscriminatorValue("X") 
    public class ChildX() extends Parent{//consider value} 
    
    //ChildY class 
    @Entity 
    @Table(name = "childY") 
    @PrimaryKeyJoinColumn(name="id") 
    @DiscriminatorValue("Y") 
    public class ChildY extends Parent(//consider value){} 
    
    //ChildZ class 
    @Entity 
    @Table(name = "childZ") 
    @PrimaryKeyJoinColumn(name="id") 
    @DiscriminatorValue("Z") 
    public class ChildZ() extends Parent{//consider value} 
    

    ユースケース、ここでスキーマ

    enter image description here

    あるクラスとは何か、ですレコードを保存する必要があります.4つの親レコードは、 dded

  • deciderが 'X/Y/Z'で、4レコードを保存する必要がある場合は、1つの親レコードと4つのChildX/ChildY/ChildZレコードを追加する必要があります。決定者が「K」であると決定者が「X/Y/Z」

    しかし、とあるとき、それは親として行動しなければならないときただし、親テーブルは、単一の子として扱われるべきである

enter image description here

判定子が「X/Y/Z」のときは、ChildX/ChildY/ChildZに4レコード、親テーブルにレコードがありません。

また、上記のレコードを取得する方法。

GrandParent gp = new GrandParent(); 
Parent p = new Parent(); 
ChildX ch = new ChildX(); 
ch.setChildrecord(p); 
p.setChildList(//Array added ch); 
p.setParentRecord(gp); 
gp.setParentList(//Array added p); 
persist(gp); 

は今、私はエラーを取得しています。..追加するには

EDITS

@Entity 
@Table(name="grand_parent") 
public class GrandParent{ 
    @OneToMany(mappedBy = "parentRecord", 
     fetch = FetchType.LAZY, 
     cascade = CascadeType.ALL) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE) 
private List<parent> parentList; 
} 

//Parent Class 
@Entity 
@Table(name = "parent") 
public class Parent{ 
@ManyToOne() 
@JoinColumn(name = "fk_gp_id") 
private GrandParent parentRecord; 

@OneToMany(mappedBy = "childrecord", 
     fetch = FetchType.LAZY, 
     cascade = CascadeType.ALL) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE) 
private List<Child> childList; 
} 

@Entity 
@DiscriminatorColumn(name = "decider", discriminatorType = DiscriminatorType.STRING) 
public abstract class Child(){ 
@ManyToOne(optional = false) 
@JoinColumn(name = "fk_parent_id") 
private parent childrecord; 
} 

//ChildX class 
@Entity 
@Table(name = "childX") 
@DiscriminatorValue("X") 
public class ChildX() extends Parent{//consider value} 
...... 

Application error : com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Child' doesn't exist

+0

親は親を拡張しませんか?そして、「親」が自分の上に存在できない場合は、抽象的にする必要があります。 –

+0

私のクエストを更新しました。はい、子は親を拡張します –

答えて

0

あなたが使用する場合は、あなたが常に挿入するの継承を(入社しました)子を保持しているときに親テーブルと子テーブルの両方の行。これは、すべての親が最大で1人の子供を持つことを意味します。 テーブルダイアグラムでは、同じ親を持つ複数の子があります。これは継承ではなく、これはOneToManyエンティティの関係であり、ER図で確認されます。

私の推測では、あなたがこのような何かを探しているということです。

@Entity 
public class Parent { 
    @Id 
    private long id; 

    @OneToMany(mappedBy = "parent") 
    private Collection<Child> children; 
} 


@Entity 
@DiscriminatorColumn(name = "decider", discriminatorType = DiscriminatorType.STRING) 
public abstract class Child { 
    @Id 
    private long id; 

    @ManyToOne 
    private Parent parent; 
    // other common fields 
} 

@Entity 
@DiscriminatorValue("X") 
public class ChildX extends Child { 
    // specific fields for child x 
} 

// more children types 

親は多くの子供を持つことができ、これらの子供たちは、異なるタイプのものとすることができます。子基本クラスは親を参照する外部キー列を持っていますが、私の経験では基本クラスは抽象に終わることがよくあります。

EDIT:ここでは、親と特定の子を格納するコードの例を示します。

EntityManager em = emf.createEntityManager(); 
try { 
    em.getTransaction().begin(); 
    Parent p = new Parent(); 
    ChildX childX = new ChildX(); 
    childX.setParent(p); 
    em.persist(p); 
    em.persist(childX); 
    em.getTransaction().commit(); 
} finally { 
    em.close(); 
} 
+0

私はそれを試みます..エラーはテーブルです子が存在しません。テーブル 'Child'が存在しないので –

+0

エンティティには何も問題はありません。したがって、どのようにテーブルを作成しましたか?また、エラーをいつ取得するかを指定する必要があります。また、コードがどのように見えるのかを確認する必要があります。親と特定の子を保存するためにJPAを含めるように答えを編集します。 –

+0

更新された私の質問...ありがとう –

関連する問題