Search code examples
javahibernateannotationstype-mismatch

Provided id of the wrong type hibernate


I am getting error:

org.hibernate.TypeMismatchException: Provided id of the wrong type for class BEntity. Expected: class BEntity, got class 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 query:

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

When I run the code in SQL Explorer it works only running it in code cause the issue...


Solution

  • Looks like this is a defect in hibernate version 3.2.6 which is still not resolved. Came across this JIRA.

    Having multiple @Id is supported by Hibernate but seems it fails under one to one mapping, suggested way of resolving this is to use single CompositeKey, which means you create a PK class

    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
    
    }
    

    then in your Entity use this as the 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;
    }