2012-05-29 3 views
2

Я получаю сообщение об ошибке:При условии идентификатора неправильного типа зимует

org.hibernate.TypeMismatchException: При условии, идентификатор неправильного типа для класса BEntity. Ожидаемый: класс 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 Explorer работает на При запуске его в коде возникает проблема ...

+0

Какая версия Hibernate вы используете? Вы используете ядро ​​или JPA? Протестировано здесь с JPA + Hibernate 4.1.3, и все прошло отлично (без ошибок). Вы уверены, что ошибка указана на выбранном или в другой части кода? – Montolide

+0

использовал hibernate 4.1.2 core – JonH

ответ

9

Похоже, что это дефект в спящем режиме версии 3.2.6, который до сих пор не разрешен. Пошел через это JIRA.

Имея многократный @Id поддерживается Hibernate, но, кажется, он не под один к одному картографирования, предложил способ решения этой проблемы является использование одного 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; 
} 
+0

Вы действительно пробовали свое решение? Я просто получаю «com.sun.istack.SAXException2: цикл обнаруживается в графе объектов.Это приведет к бесконечно глубокому XML », но отношения OneToOne двунаправлены в моем случае. Почему вы используете @Id вместо @EmbeddedId? – gouessej

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

После этого необходимо (если у вас есть разные имена), чтобы добавить в вашем PrimaryKey класса (в моем case E1Id) свойство tid (с методами геттера и сеттера)

1

Надеюсь, это поможет кому-то. Я столкнулся с той же проблемой. У меня было два отдельных класса PK, которые имели одинаковые поля. Поэтому был удален один ПК и использовался только один в собственнике и дочернем объекте.

Решено.