0

リスト(またはマップ)を含むエンティティのマッピングに問題があります。注釈のさまざまな組み合わせを試しましたが、「最適」に機能する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個あります

UserOrderHibernateに製品ごとに1つではなく、1つ返してもらうにはどうすればよいですか?または、この構造をモデル化するための正しいアプローチを取っていますか?

4

1 に答える 1