2017-12-11 14 views
1

netbeans 8.1ではエンティティとjpaコントローラを生成しました。 私は親エンティティと1対1の関係を持つ子を持っています。 子エンティティが主キーが親への外部キーに等しいがあります。これを避けるにはjpaで親例外を削除する

IllegalOrphanException: This Parent (model.Parent[ id=1 ]) cannot be destroyed since the Child model.Child[ parentId=1 ] in its child field has a non-nullable parent field. 

私は最初の子を削除する必要がありますが、私は私が得る親を削除しようとすると

@Entity 
@Table(name = "parent") 
@XmlRootElement 
public class Parent implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "id") 
private Integer id; 
@OneToOne(cascade = CascadeType.ALL, mappedBy = "parent") 
private Child child; 

public Parent() { 
} 
    etc.... 
} 


@Entity 
@Table(name = "child") 
@XmlRootElement 
public class Child implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "parent_id") 
    private Integer parentId; 
    @JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false) 
    @OneToOne(optional = false) 
    private Parent parent; 
    public Child() { 
    } 
    etc.... 
} 

それはカスケードのためです。それはすでに自動的に行われるべきです。子クラスのコーディング

+0

につながる

create table child (parent_id integer not null,..., primary key (parent_id)) create table parent (id integer not null, ..., primary key (id)) alter table child add constraint ... foreign key (parent_id) references parent 

ようになり、次のようにそれを制御し、双方向の関係です子供の側で、最初の質問は、リファレンスセットですか? JPAは、参照を維持している場合にのみ参照をカスケードできます。削除する前に親参照でem.refreshを呼び出すと、子インスタンスを作成するときにparent.child参照が設定されていることを確認してください。 – Chris

+0

作成時にparent.child参照を設定すると、「EntityNotFoundException:Entity for ID:1を見つけることができませんでした」というメッセージが表示されます。 – blob

+0

私は理解していません、それを永続化する前に子エンティティを見つけようとしていますか?おそらく親インスタンスがあり、子を作成しているので、それをルックアップする必要はありません。 child.parent = parentを設定すると、parent.child = childも設定されます。 – Chris

答えて

0

作品は

@Entity 
@Table(name = "child") 
@XmlRootElement 
public class Child implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @JoinColumn(name = "parent_id", referencedColumnName = "id") 
    @OneToOne(optional = false) 
    private Parent parent; 
    ... 
} 

テーブルが親(em.remove(parent))の除去は

delete from child where parent_id=? 
delete from parent where id=? 
関連する問題