1

多分これは簡単な答えの質問です...しかし、私はそれを実行していません。persist() で、子テーブルの参照キーが null であるという例外が発生します (もちろん、データベースでは許可されていません)。レシピと準備のためのいくつかの手順があります。

私はEclipseLink 2.4.1を使用しています

Recipe.java (rcpid は JPA によって自動設定されます)

@Entity
public class Recipe {
    @Id
    long rcpid;

    List<Recipestep> recipesteps = new ArrayList<>();

    @OneToMany(
        cascade=CascadeType.ALL,
        fetch=FetchType.EAGER,
        mappedBy="recipe",
        targetEntity=Recipestep.class )
// This does NOT work. Following line tries to access a join-table !!!
// @JoinColumn(name="rcpid", referencedColumnName="rcpid") 
        public List<Recipestep> getRecipesteps() { return recipesteps; }
    // some more attributes, getters and setters
}

Recipestep.java (rpsid は JPA によって自動設定されます)

@Entity
public class Recipestep {
    @Id
    long rpsid;

    Recipe recipe;

    @ManyToOne( targetEntity=Recipe.class )
    @JoinColumn( name="rcpid" )
    public Recipe getRecipe() { return recipe; }

    // some more attributes, getters and setters
}

上記のコードは有効な回避策です。ただし、クリーンな (そしてサポート可能な) コードを作成するには、関係は、すべての子を参照する親のコレクションとの一方向のみにする必要があります。

4

2 に答える 2

1

これを単方向の 1 対多としてマップしましたが、recipestep rcpid データベース列には 2 つのマッピングがあります。長いrcpidをに変更してみてください

@ManyTOne
Recipe rcp;

次に、oneToMany から joincolumn 定義を削除し、rcp manyToOne リレーションによってマップされているものとしてマークすることで双方向にします。ここに例が投稿されています http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Relationship_Mappings/Collection_Mappings/OneToMany

Eclipselink は、最初にターゲット エンティティを挿入するときに joincolumn を使用して一方向の oneToMany リレーションに常に null を挿入し、後で Recipe エンティティを処理するときにそれを更新します。Recipestep の rcpid マッピングもおそらく null です。これは、同じフィールドに対して 2 つの書き込み可能なマッピングがあることを意味します。これは、特にこのように競合する場合に悪いことです。

于 2013-05-13T12:05:29.947 に答える
0

デフォルトの JPA の動作が発生しています。リストにエンティティを追加するrecipestepsだけでは、双方向の関係を作成するには不十分です。

rcpidこの問題を解決するには、リスト内のすべての要素に明示的に設定する必要があります。

編集Recipe: 問題は、JPA がRecipestep テーブルの id を格納する場所がわからないことだと思います。名前(「recipebo_rcpid」)を想定していますが、テーブルにはそれがないようです。

列「recipe_id」をRecipestepテーブルに追加し、mappedBy属性を@OneToMany注釈に追加してみてください。

@OneToMany(
  cascade=CascadeType.ALL,
  fetch = FetchType.EAGER,
  mappedBy = "recipe" )

targetEntityおそらく、注釈に属性は必要ありませんList-既に入力されています。

于 2013-05-12T18:16:41.290 に答える