2017-10-23 15 views
1

に、私は追加のデータとの交差テーブルを追加していると私はを使用するには、このテーブル内のレコードに拘束されたエンティティのための複雑なIDを作るためにを@EmbeddedId(entity1entity2)。@EmbeddedId内のカスケードが休止状態

Entity1ToEntity2Linkで
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, 
      fetch = FetchType.LAZY, mappedBy = "id.entity1") 
private List<Entity1ToEntity2Link> links = new ArrayList<>(); 

私は@EmbeddedIdを持っており、その中で、私はへのリンクを持っている:

は私がそうエンティティ1を保存するときに、カスケードを経由して、すべてのデータを保存したい、それが実体1で私が持っている理由であります両方のエンティティ。しかし、私はそうエンティティ1を保存するときに、第2の1を保存することにしたい、私はこのようにそれを作った:

@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
private Entity2 entity2; 

しかし、生憎、私は@EmbeddedIdの内側に持っているカスケードは無視しているようです。私は、挿入のためにそのSQLが生成されていない見ることができるとEntity1ToEntity2Linkが保存されるとき、私はエラーを取得する:

violated - parent key not found

私は@EmbeddedIdのカスケードをサポートしていないと思われます。確信はないけど。 Entity1ToEntity2Linkが保存される前にentity2をどのように保存できるか考えていますか?


IDオブジェクト:

@Embeddable 
public class LinkId extends AbstractLinkId { 
    //... 
    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
    private Entity2 entity2; 
    //... 
} 


@MappedSuperclass 
public class AbstractLinkId { 
    //... 
    @ManyToOne 
    private Entity1 entity1; 
    //... 
} 

答えて

1

代わりのEntity1ToEntity2Linkが直接多対多の関係をみてください使用。

public class Entity1 { 

    @ManyToMany 
    @JoinTable(
     name="LINK_TABLE_NAME", 
     [email protected](name="ENTITY1_ID", referencedColumnName="ID"), 
     [email protected](name="ENTITY2_ID", referencedColumnName="ID")) 
    private List<Entity2> entities2; 
} 

public class Entity2 { 

    @ManyToMany(mappedBy="entities2") 
    private List<Entity1> entities1; 
} 

あなたのアプローチの問題は次のとおりです。 Entity1のsaveを呼び出して、Entity1ToEntity2Linkにカスケードします。現在、Entity1ToEntity2Linkは主キーにEntity1が必要ですが、Entity1はまだ存在しません。

Entity1ToEntity2Linkを使用して保存する方法は2通りあります。

最初に、Entity1ToEntity2Linkにカスケードを追加して、Entity1を保存した後にリンクを保存しないでください。

2番目:生成されたIdをEntity1ToEntity2Linkに追加します。

+0

あなたの2番目の解決策が私のために働きます。私は自動生成されたIDを追加し、古いIDを@埋め込みオブジェクトとして作成します。しかし、なぜ@ EmbeddedIdがカスケードセービングをサポートしていないのはなぜですか?それは文書化されていますか? – dvelopp