2017-11-14 4 views
0

私は子エンティティをinseryingせずに親エンティティを挿入するために、保存メソッドを呼び出したときに、私は 例外hibernateで共有プライマリキーによって1対1の関係で子を挿入せずに親エンティティを保存する方法は?

org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.example.sms.domain.Child.parent] 

Schema of parent and child table

の下に取得休止状態で共有主キーによる1対1の関係、 を使用しています

親クラスエンティティのマッピングを伴う子クラスエンティティのコードは、 以下です。

@Entity 
@Table(name = "t_child") 
public class Child { 

@Id 
    @Column(name="user_id", unique=true, nullable=false) 
    @GeneratedValue(generator="gen") 
    @GenericGenerator(name="gen", strategy="foreign", [email protected](name="property", value="user")) 
    private Long id; 

@OneToOne(optional = false,fetch = FetchType.LAZY) 
    @PrimaryKeyJoinColumn 
    private Parent parent; 

と私はのような

@OneToOne(mappedBy="parent", cascade=CascadeType.ALL) 
    private Child child; 

の下に子クラスのエンティティをマッピングした親クラスのエンティティ内の子実体を挿入することなく、唯一の親エンティティを保存する方法はありますか?

+0

を持つオブジェクトを持ってオブジェクトを保存されたとき: '@OneToOne( mappedBy = "親"、カスケード=カスケード型。ALL、nullable = true) ' –

+0

' cascade = CasecadeType.ALL'を削除して試してください。 – ujulu

+0

@JorgeCampos:その表示属性nullableは、アノテーションタイプのために定義されていません。OneToOne –

答えて

0

エンティティリレーションシップダイアグラムでは、1対1の関係は示されていません。しかし、それを前提としましょう。

私があなたをよく理解していれば、子エンティティは親エンティティに依存しており、独自のアイデンティティを持っていません。したがって、ID属性を定義する必要はありません。そうChildエンティティのマッピングは、以下のようになります。

@Entity 
@Table(name = "t_child") 
public class Child { 

    @Id 
    @OneToOne(optional = false,fetch = FetchType.LAZY) 
    @JoinColumn(name="parent_id") 
    private Parent parent; 
    // ... 

} 

Parentエンティティは次のようになります。

@Entity 
@Table(name = "t_parent") 
public class Parent { 

    @Id 
    @GeneratedValue(generator="gen") 
    private Long id; 

    @OneToOne(mappedBy="parent") 
    private Child child; 

    // ... 
} 

マッピングする必要があること。さて、あなたは次のように行う子なしで親を保存したい場合:

Parent parent = new Parent(); 
// set attribute values 
entityManager.persist(parent); 

しかし、あなたは子供を保存したい場合は、子が親に依存しているので、あなたが最初に親を保存する必要がなければならないことを知っている必要がありますが、どの親が存在しなければならないことを意味します。私は解決策を見つけた

+0

あなたのコードを試しましたが、親エンティティを保存中に "fisrt_name、last_nameなどのすべての子属性名の名前を挿入できませんでした"というメッセージがまだ表示されています –

+0

私は現在仕事中です。コードを投稿すると、誰かが答えない限り、私は夕方にそれを試してみるでしょう。 – ujulu

0

最後に、1日目の後に自分自身

このコードは正しかったです。 は私が送信されなかっただけで、親エンティティを格納するが、私はすべての 子の詳細を格納しながら、私が使用したのと同じDTOオブジェクトを使用していた

@Mappings({ 

      @Mapping(source = "fatherName", target = "child.childDetail.fatherName"), 
      @Mapping(source = "motherName", target = "child.childDetail.motherName"), 
      @Mapping(source = "firstName", target = "child.childDetail.firstName"), 
      @Mapping(source = "lastName", target = "child.childDetail.lastName"), 
      @Mapping(source = "dateOfBirth", target = "child.childDetail.dateOfBirth"), 
     }) 
    public User ParentDtoToParent(ParentDto parentDto); 

ドメインオブジェクトにDTOを変換しながらMapstructは、問題を作成していましたany Json形式の子詳細値。だから、子供の属性(FIRSTNAME、姓など)に自動的に 割り当てられたNULL値をmapstruct HibernateはそれがNull値の代わりにNULLオブジェクトの属性の

親で
関連する問題