1

これが私のコードの簡素化されたバージョンです:

@Entity
public class Item implements Serializable{

@Id
@GeneratedValue
private long id;

@ElementCollection(fetch=FetchType.EAGER ,targetClass=Cost.class)
@CollectionTable(name="ItemCost", joinColumns = {@JoinColumn(name="itemId")})
private Set<Cost> costs= new HashSet<Cost>();

@ElementCollection(fetch=FetchType.EAGER ,targetClass=ItemLocation.class)
@CollectionTable(name="ItemLocation", joinColumns = {@JoinColumn(name="itemId")})
private Set<ItemLocation> itemLocations;

}

上記のコードは許可されていますか? @ElementCollection で使用している 2 つの埋め込み可能なクラス Cost と ItemLocation があります。

問題: 名前付きクエリを実行しようとすると

@NamedQuery(name = "Item.findAll", query = "SELECT i FROM Item i")

私は奇妙な振る舞いをしています。2 番目の elementcollection (ItemLccation テーブル) のレコードが 2 倍になります (テーブルに挿入されます)。

4

1 に答える 1

0

JPA 2.0に関して言えば、コードは許可されています。ElementCollectionで注釈が付けられたコレクションを複数持つことは完全に合法です。また、それはおそらくあなたが抱えている問題とは何の関係もありません。ちなみに、それが本当にあなたの問題であるかどうかを知るために、コストを徴収せずにコードを試しましたか?

このコレクションの正確な重複が最初に発生するのはどの時点ですか?ItemLocationがequals&hashcodeを定義していない場合、自分でアイテムを追加した結果、重複が簡単に発生する可能性があります。

おそらく、この問題に直面しています。CollectionTableの主キーと、リストにタイプを変更し、@OrderColumnを追加すると役立ちます。

于 2012-03-02T06:29:20.870 に答える