0
criteria = createCriteria("employee");
criteria.add(Restrictions.eq("name", "Jack"));
criteria.createAlias("certificate", "cert");
criteria.add(Restrictions.eq("cert.certType", "MSFT"));  

criteriaList = criteria.list();

以下のデータを考えると、上記のクエリは、証明書のセット (セット サイズ = 2) を含む 1 つのレコードを返すはずだったと思いますが、同じレコードが 2 回複製されます (Certificate テーブルの各レコードに対して 1 回)。なぜこうなった?

従業員テーブル:

EMP_ID          NAME    
123             Jack                                
111             Mary            
000             Larry   

証明書テーブル データ

emp_id      certificate_type    seq_no
123         MSFT                  1
123         MSFT                  2
111         English               1

従業員.hbm.xml

<class name="com.Employee" table="Employee" entity-name="employee" mutable="false">
        <cache usage="read-only"/>
        <id name="id" column="employee_id"/>
        <set name="certificate" fetch="select" inverse="true" lazy="false" >
            <key column="employee_id" />
            <one-to-many class="com.Certificate" entity-name="CertificateType"/>
        </set>
</class>    

certificate.hbm.xml

<class name="com.Certificate" table="Certificate" entity-name="CertificateType" mutable="false">
    <cache usage="read-only"/>
    <composite-id class="com.usps.nom.tops.model.impl.DispatchLegPKImpl" mapped="true">
            <key-property name="empId" column="emp_id" />
            <key-property name="seqNo" column="SEQ_NO" />
    </composite-id>
    <property name="certType" column="certificate_type"/>
</class>

POJO

public class Employee {
   private int id;
   private String ame;  
    //getters and setters
    public boolean equals(Object obj){}
}
public class Certificate {
   private int emp_id;
   private String certType; 
   private String seqNo;
   //getters and setters   
   public boolean equals(Object obj){}
    }

編集: 結果 (つまり、私の例では criteriaList) をセットに入れると、重複したレコードが削除されます。

Set<Employee> empSet = new HashSet<Employee>(criteriaList); 
4

1 に答える 1

3

私は Hibernate の初心者ですが、同様の問題に直面しています(結合によって親レコードが複製されます) 。

FetchMode.SUBSELECT注釈を追加しました(私は注釈を好みます)

@OneToMany
@Fetch(FetchMode.SUBSELECT)

データを複製することなく、私にとっては完璧に機能しているようです。

于 2014-01-21T23:05:57.287 に答える