Hibernate标准没有填充关联

时间:2014-02-21 19:53:11

标签: java hibernate hibernate-mapping

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

class 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;

......
}

class 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时,为数据库中的每个Txn返回TxnProduct对象,但我对hibernate标准的期望是为txn中的每一行返回Txn个对象表格并在其中设置Set<TxnProduct>

我尝试了Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);,但没有帮助。 感谢。

1 个答案:

答案 0 :(得分:1)

Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);应该适用于大多数情况,除非我们对setFirstResultsetMaxResult这样的父实体使用分页。 JoinTypeFetchMode可能存在问题。

使用q.list()包裹Set将是更好的选择,无论任何提取模式。就像是 Set<Txn> resutls = new HashSet<Txn>(L));或者如果要再次返回列表,请使用list包装该集合 List<Txn> results = new ArrayList<Txn>(new HashSet<Txn>(L));