9

エラーが発生しています:

org.hibernate.TypeMismatchException:クラスBEntityに間違ったタイプのIDが指定されました。期待:クラスBEntity、クラスAEntityを取得

public class BEntity implements Serializable{
    @Id
    @Column(name = "NUM")
    private String num;

    @Id
    @Column(name = "INIT")
    private String init;

    @Column(name = "V_CNT")
    private Integer vcnt;

   //{{{some column omitted}}}//
}

public class AEntity implements Serializable{

    @Id
    @Column(name = "NUM")
    private String num;

    @Id
    @Column(name = "INIT")
    private String init;

    @OneToOne
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="NUM", referencedColumnName="NUM"),
        @PrimaryKeyJoinColumn(name="INIT", referencedColumnName="INIT")
    })
    private BEntity bEntity;
}

HQLクエリ:

String queryString = "FROM AEntity AS A " +
                     "LEFT JOIN A.bEntityAS B " +
                     "WHERE A.INIT||A.NUM IN (:carList) AND A.INIT IN (:initList) AND A.NUM IN (:numberList) " + 
                     "AND B.TRUK_AXL_CNT > 0";

休止状態のgen-code

select aentity0_.NUMBER as NUMBER4_0_, aentity0_.INITIAL as INITIAL4_0_, bentity_p1_.NUMBER as NUMBER5_1_, bentity_p1_.INITIAL as INITIAL5_1_, aentity0_.V_CNT as VCNT3_4_0_, aentity0_.EIN as EIN4_0_, aentity0_.TYP as TYP5_4_0_, aentity0_.TRUK_CNT as TRUK6_4_0_, bentity_p1_.TRUK_AXL_CNT as TRUK3_5_1_ from USR.aentity aentity0_ left outer join USR.bentity_PRIMARY bentity_p1_ on aentity0_.NUMBER=bentity_p1_.NUMBER and aentity0_.INITIAL=bentity_p1_.INITIAL 
where (aentity0_.INITIAL||aentity0_.NUMBER in (?,?,?)) 
and (aentity0_.INITIAL in (?,?,?)) 
and (aentity0_.NUMBER in (?, ?, ?))
and bentity_p1_.TRUK_AXL_CNT>0

SQL Explorerでコードを実行すると、コードでのみ実行すると問題が発生します...

4

3 に答える 3

16

これはHibernateバージョン3.2.6の欠陥のようですが、まだ解決されていません。このJIRAに出くわしました。

複数を持つこと@IdはHibernateでサポートされていますが、1対1のマッピングでは失敗するようです。これを解決するための推奨される方法は、単一のCompositeKeyを使用することです。つまり、PKクラスを作成します。

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class PKClass implements Serializable {

    @Column(name = "NUM")
    private String num;

    @Column(name = "INIT")
    private String init;

    //gettter setter here

}

次に、エンティティでこれをIDとして使用します

public class BEntity implements Serializable{

    @Id
    private PKClass pkClass = null;

    @Column(name = "V_CNT")
    private Integer vcnt;

   //{{{some column omitted}}}//
}

public class AEntity implements Serializable{

    @Id
    private PKClass pkClass = null;

    @OneToOne
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="NUM", referencedColumnName="NUM"),
        @PrimaryKeyJoinColumn(name="INIT", referencedColumnName="INIT")
    })
    private BEntity bEntity;
}
于 2012-05-29T19:40:59.970 に答える
5

私は同じ問題に直面しました。同じフィールドを持つ2つの別々のPKクラスがありました。そのため、PKを1つ削除し、所有者と子のエンティティで1つだけ使用しました。これで問題は解決しました。

于 2016-06-10T06:11:00.983 に答える
0

私も同じ問題を抱えていました。

開始状況

マスターテーブルの主キー

        <composite-id name="id" class="model.E1Id">
        <key-property name="taxpayerId" type="int">
            <column name="TaxpayerID" />
        </key-property>
        <key-property name="year" type="int">
            <column name="Year" />
        </key-property>
    </composite-id>

詳細テーブルの主キー

 <composite-id name="id" class="model.E1dataFromTaxPayerFolderId">
        <key-property name="tid" type="int">
            <column name="tID" />
        </key-property>
        <key-property name="year" type="int">
            <column name="Year" />
        </key-property>
    </composite-id>

修復後 、詳細テーブルcomposite-idのクラスを変更し、プライマリテーブルのクラスを次のように設定します。

        <composite-id name="id" class="model.E1Id">
        <key-property name="tid" type="int">
                            <column name="tID" />
                    </key-property>
        <key-property name="year" type="int">
            <column name="Year" />
        </key-property>
    </composite-id>

その後、主キークラス(私の場合はE1Id)にプロパティtid(getterメソッドとsetterメソッドを使用)を追加する必要があります(名前が異なる場合)。

于 2013-06-06T20:48:31.957 に答える