映射地图或列表会将父结果相乘

时间:2012-11-26 10:39:00

标签: java spring hibernate jpa annotations

我在映射包含列表(或映射)的实体时遇到问题。我尝试了各种注释组合,但是“最佳”的两种变体都有这种行为。例如,如果父对象具有3个子对象,则会检索父对象三次。

我的代码

在我的情况下,我有一个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 - 对象,而不是我存储的每个订单都有一个UserOrder。所以我在列表中得到了重复项,所有这些都包含了它所包含的产品的完整信息。没有产品的订单也包括在内

  • 订单1 - 有2个产品
    • 1 x DogToy1
    • 3 x Cat Toy 1
  • 订单1 - 有2个产品
    • 1 x DogToy1
    • 3 x Cat Toy 1
  • 订单2 - 有1个产品
    • 3 x Cat Toy 1
  • 订单3 - 有0个产品

如何让Hibernate给我一个(1)UserOrder而不是每个产品一个?或者,我是否采用正确的方法对此结构进行建模?

1 个答案:

答案 0 :(得分:0)

选项:

  • 延迟加载子集合(应该有批处理加载延迟加载集合的选项)
  • 在查询
  • 上使用DistinctRootentityResulttransformer