リスト(またはマップ)を含むエンティティのマッピングに問題があります。注釈のさまざまな組み合わせを試しましたが、「最適」に機能する2つのバリエーションはどちらもこの動作をします。たとえば、親オブジェクトに3つの子オブジェクトがある場合、親オブジェクトは3回取得されます。
私のコード
私の場合、カウント付きのsのUserOrder
ペアを含むオブジェクトがあります。Product
データ構造は次のようになります
@Entity
public class UserOrder{
/*
* VARIATION 1
* I did actually vary some of these annotions, not all are necessary.
* I believe the @CollectionTable is the key here
*/
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable
@Column
@Embedded
private List<ProductCount> products;
/*
* VARIATION 2
*/
@ElementCollection(fetch = FetchType.EAGER)
private Map<Product, Integer> products = new HashMap<Product, Integer>();
// get/set
// ...
}
@Embeddable
/* Only used in variation 1 */
public class ProductCount{
@OneToOne
private Product product;
@Column
private Integer amount;
// get/set
}
@Entity
public class Product
{
// ...
}
次に、これが呼び出され、次のようなものを使用して表示されます(これはバリエーション2用です)
<!-- Called via DAO/Service layers
List<Order> orders = getSession().createCriteria(UserOrder.class).list();
-->
<c:forEach items="${orders}" var="order">
<fmt:formatDate value="${order.time}" type="both" />
<c:forEach items="${order.products}" var="pc">
${pc.value} x ${pc.key.name}
</c:forEach>
</c:forEach>
記録のために、私はSpring(3.1)、Hibernate(3.5)を使用しており、JPAアノテーションを使用したいと思います。
問題
注文を取得すると、保存した注文ごとUserOrder
に1つではなく、含まれている製品ごとにオブジェクトを取得しUserOrder
ます。そのため、リストに重複があり、すべてに含まれている製品の完全な情報が含まれています。製品なしの注文も含まれます
- 注文1--2つの製品があります
- 1 x DogToy1
- 3x猫用おもちゃ1
- 注文1--2つの製品があります
- 1 x DogToy1
- 3x猫用おもちゃ1
- 注文2--1つの製品があります
- 3x猫用おもちゃ1
- 注文3-製品が0個あります
UserOrder
Hibernateに製品ごとに1つではなく、1つ返してもらうにはどうすればよいですか?または、この構造をモデル化するための正しいアプローチを取っていますか?