Jon*_*onH 6 java annotations hibernate type-mismatch
我收到错误:
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";
Hibernate代码
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资源管理器中运行代码时,它只能在代码中运行它导致问题...
mpr*_*hat 11
看起来这是hibernate版本3.2.6中的一个缺陷,但仍未解决.碰到了这个JIRA.
@IdHibernate支持多个,但似乎在一对一映射下失败,建议的解决方法是使用单个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;
}