2014-02-21 95 views
0

我正在使用休眠標準api來獲取txn和txn_products表的數據。 下面是映射。休眠標準沒有填充關聯

類事務處理:

@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回報Txn對象在數據庫中的每個TxnProduct,但什麼我期望從休眠c riteria將爲txn表中的每一行返回Txn對象,並在其中設置Set<TxnProduct>

我試過Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);但它沒有幫助。 謝謝。

回答

1

Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);應該可以在大多數情況下工作,除非我們在母公司如setFirstResultsetMaxResult上使用分頁。 JoinTypeFetchMode可能有問題。

Set包裝q.list()將是更好的選擇,不管任何獲取模式。類似於 Set<Txn> resutls = new HashSet<Txn>(L));或者如果您想再次返回列表,請使用列表將套餐換行 List<Txn> results = new ArrayList<Txn>(new HashSet<Txn>(L));