【问题标题】:Hibernate criteria not populating associations休眠标准不填充关联
【发布时间】:2014-02-21 19:53:10
【问题描述】:

我正在使用 hibernate criteria api 来获取 txn 和 txn_products 表的数据。 下面是映射。

类 Txn:

@Entity
@DynamicUpdate(value=true)
@Table(name="txn")
public class Txn
{
 @OneToMany(fetch=FetchType.LAZY , mappedBy = "transaction" , cascade = CascadeType.ALL)
    Set<TxnProduct> txnProducts = null;

    @Id
    @Column(name="id" , nullable=false)
    private String id;

......
}

类 TxnProduct :

@Entity
@DynamicUpdate(true)
@Table(name="txn_product")
public class TxnProduct
{

 @Id
    @Column(name="id" , nullable=false)
    private String id;

  @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="txn_id")
    private Txn transaction ;
.....
}

业务逻辑:

   Session sx = .......... ;
      Criteria Q = sx.createCriteria(Txn.class, "txn");
              Q.createAlias("txn.txnProducts", "txnProducts" , JoinType.INNER_JOIN);

                List<Txn> L = (List<Txn>) Q.list();


                logger.info(L) ;

                for(Txn T : L)
                {
                    logger.info(T);
                    logger.info(T.getTxnProducts());
                }

       sx.close();

在执行业务逻辑时List L 为数据库中的每个TxnProduct 返回Txn 对象,但我期望从休眠标准中返回Txn 对象为txn 表中的每一行并在其中设置Set&lt;TxnProduct&gt; .

我试过Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);,但没有用。 谢谢。

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 应该可以在大多数情况下工作,除非我们在父实体上使用分页,例如 setFirstResultsetMaxResultJoinTypeFetchMode 可能存在一些问题。

    Set 包装q.list() 将是更好的选择,无论任何获取模式。就像是 Set&lt;Txn&gt; resutls = new HashSet&lt;Txn&gt;(L)); 或者如果你想再次返回一个列表,用列表包装集合 List&lt;Txn&gt; results = new ArrayList&lt;Txn&gt;(new HashSet&lt;Txn&gt;(L));

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2012-06-10
      • 2011-10-09
      • 2012-12-24
      相关资源
      最近更新 更多