2017-05-01 4 views
0

、ParentOneはスキーマS2をしてChildTableとともにスキーマS1とParentTwoであり、は春データJPA 2つの異なるスキーマ間の親子関係を持つテーブルを永続私がやろうとしています

ChildTable child = new ChildTable(); 
clild.setParentTwoID(prentTwoID); 
ParentOne parentOne = new ParentOne(); 
parentOne.getChildTableList().add(childTable); 
parentReposetory.save(parentOne); 

ParentOne.java

@Data 
@EqualsAndHashCode(callSuper = false) 
@Entity 
@Table(name = "ParentOne", schema = "S1") 
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, scope = ParentOne.class) 
public class ParentOne implements Serializable { 

    private static final long serialVersionUID = 7502273069461829133L; 

    @Id 
    @Column(name = "ParentOneID", unique = true, nullable = false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer parentOneID; 

    @OneToMany(targetEntity = ChildTable.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "ParentOneID", nullable = false, insertable = false, updatable = false) 
    private List<ChildTable> childTableList; 
} 

ParentTwo.java

@Data 
@EqualsAndHashCode(callSuper = false) 
@Entity 
@Table(name = "ParentTwo", schema = "S2") 
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, scope = ParentTwo.class) 
public class ParentTwo implements Serializable { 

    private static final long serialVersionUID = 7502273069461829133L; 

    @Id 
    @Column(name = "ParentTwoID", unique = true, nullable = false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer parentTwoID; 

    @OneToMany(targetEntity = ChildTable.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "ParentTwoID", nullable = false, insertable = false, updatable = false) 
    private List<ChildTable> childTableList; 
} 

ChildTable.java

@Data 
@EqualsAndHashCode(callSuper = false) 
@Entity 
@Table(name = "ChildTable", schema = "S2") 
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, scope = ChildTable.class) 
public class ChildTable implements Serializable { 

    private static final long serialVersionUID = -6331600489988183852L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ChildTableID", unique = true, nullable = false) 
    private Integer childTableID; 

    @Column(name = "ParentOneID") 
    private Integer parentOneID; 

    @Column(name = "ParentTwoID", nullable = false) 
    @NotNull(message = "mandatory_field") 
    private Integer parentTwoID; 

} 

ここParentTwoは、Alであります準備ができて、私はそれのIDを持っています。私は別のスキーマのChildTableと共にParentOneだけを永続化しようとしています。私がこれをしている間、私は間違いを言っている。

+0

エラーは、列が 'ChildTable.ParentOneID'がそれに' NOT NULL'制約があり、 'INSERT'は'ヌルで発行されていることをことを言います'その列の値。コード内のその列の値をどこにでも設定していないため、エラーが予想されます。何が問題なのですか? – manish

+0

@manish JPAはparentOneIDを作成するParentOneテーブルを挿入し、次に生成されたparentOneIDとともにChildTableを挿入します。しかし、ここで私はそれが起こっていない。 –

答えて

0

JPAを使用していて、リレーションシップをプロバイダーが管理する場合は、プロバイダーがリレーションシップを管理できるようにする必要があります。あなたの場合、さまざまな外部キー識別子を自分で追跡することで、関係を自分で管理しています。したがって、JPAでは、列値を手動で管理すると宣言し、エンティティの関連性をプロバイダに通知していないため、列値を設定することはできません。

基本的な問題は、JPA(または他のORM)の仕組みを理解することにあるようです。エンティティは、データベース表の列単位のレプリカではありません。基盤となるデータベースを意識することなく、オブジェクトとして考え、モデル化する必要があります。エンティティ属性のデータベース列へのマッピングはJPAに委ねられます。

ParentOne entity

@Entity 
@Table(name="ParentOne", schema="S1") 
public class ParentOne { 
    @Id 
    @Column(name="ParentOneID", unique=true, nullable=false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="parentOne") 
    private List<Child> children; 

    public void addChild(final Child child) { 
    if (children == null) { 
     children = new ArrayList<>(); 
    } 

    children.add(child); 

    child.setParentOne(this); 
    } 
} 

ParentTwo entity

@Entity 
@Table(name="ParentTwo", schema="S2") 
public class ParentTwo { 
    @Id 
    @Column(name="ParentTwoID", unique=true, nullable=false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="parentTwo") 
    private List<Child> children; 

    public void addChild(final Child child) { 
    if (children == null) { 
     children = new ArrayList<>(); 
    } 

    children.add(child); 

    child.setParentTwo(this); 
    } 
} 

Child entity

@Entity 
@Table(name="ChildTable", schema="S2") 
public class Child { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="ChildTableID", unique=true, nullable=false) 
    private Integer id; 

    @ManyToOne(cascade=CascadeType.PERSIST) 
    @JoinColumn(name="ParentOneID", nullable=false) 
    private ParentOne parentOne; 

    @ManyToOne(cascade=CascadeType.PERSIST) 
    @JoinColumn(name="ParentTwoID", nullable=false) 
    private ParentTwo parentTwo; 

    void setParentOne(final ParentOne parentOne) { 
    this.parentOne = parentOne; 
    } 

    void setParentTwo(final ParentTwo parentTwo) { 
    this.parentTwo = parentTwo; 
    } 
} 


は、問題を解決する次のエンティティモデルは、(すべての不要なコードは、簡潔にするために除去問題上の任意のベアリングを持っていません)

この後、次のコードは正常に動作します:

Child child = new Child(); 
... 

ParentOne parentOne = new ParentOne(); 
ParentTwo parentTwo = new ParentTwo(); 
... 

parentOne.addChild(child); 
parentTwo.addChild(child); 

parentOneRepository.save(parentOne); 
+0

ええとそれは働いていて、私は3つのテーブルを一緒に(つまり) 'clild.setParentTwoID(prentTwoID);を残しておくことが可能であることを知りたいと思いますこのコード行を与えるつもりはありませんか? –

+0

はい、適切な関連エンティティにカスケードするように操作が構成されている限り、どのエンティティインスタンスでも保存を開始でき、他のすべてのエンティティにカスケードすることができます。詳細については、編集済み回答を参照してください。 – manish

関連する問題