JPA / Hibernate наследование при загрузке: IllegalArgumentException, попробуйте установить неправильный подкласс - PullRequest
2 голосов
/ 21 марта 2012

Я использую JBoss 6.1, у меня возникла ситуация с JPA, в результате я получил следующее сообщение об ошибке:

IllegalArgumentException: Невозможно установить поле EquipmentB, поле EquipmentCycleB.оборудование для EquipmentA

предположим, что у каждого объекта есть аннотированное поле @Id:

Первая иерархия

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DIS", discriminatorType = DiscriminatorType.STRING, length = 1)
public abstract class Equipment { ... }

@Entity
@DiscriminatorValue("A")
public class EquipmentA extends Equipment { ... }

@Entity
@DiscriminatorValue("B")
public class EquipmentB extends Equipment { ... }

Вторая иерархия

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DIS", discriminatorType = DiscriminatorType.STRING, length = 10)
public abstract class EquipmentCycle { 

   ...

}

@Entity
@DiscriminatorValue("A")
public class EquipmentCycleA extends EquipmentCycle {

   @JoinColumn(name = "EQUIPMENT_ID", referencedColumnName = "ID")
   @ManyToOne
   private EquipmentA equipment;

   ...

}

@Entity
@DiscriminatorValue("B")
public class EquipmentCycleB extends EquipmentCycle { 

   @JoinColumn(name = "EQUIPMENT_ID", referencedColumnName = "ID")
   @ManyToOne
   private EquipmentB equipment;

   ...

}

Пока ничего странного, продолжай, класс скажет Статус

@Entity
public class State {

   @JoinColumn(name = "ENTITY_ID", referencedColumnName = "ID", nullable = false)
   @ManyToOne
   private EnityWithState enityWithState;

   @JoinColumn(name = "EQUIPMENT_ID", referencedColumnName = "ID")
   @ManyToOne
   private Equipment equipment;

   @JoinColumn(name = "EQUIPMENT_CYCLE_ID", referencedColumnName = "ID")
   @ManyToOne
   private EquipmentCycle equipmentCycle;

   ...

}

и класс, к которому принадлежит государство

public class EnityWithState { 

...

    @OneToMany(mappedBy = "enityWithState", fetch = FetchType.LAZY, cascade = CascadeType.ALL,   orphanRemoval = true)  
    private List<State> stateHistory;

    ...

}

Не спрашивайте меня, почему, я только что нашел это. Через некоторое время в БД сохранятся следующие данные

Table Equipment

ID  DIS
--------------------------------
1   A  ...
2   B  ...

Table EquipmentCycle

ID  DIS  EQUIPMENT_ID
--------------------------------
 1   A    1
 2   B    2

Table State

ID  ENTITY_ID EQUIPMENT_ID EQUIPMENT_CYCLE_ID
---------------------------------------------
1     1           1              1
2     1           2              2

И, наконец, когда я пытаюсь загрузить EnityWithState с идентификатором 1, я получаю следующую ошибку:

IllegalArgumentException: Невозможно установить поле EquipmentB, поле EquipmentCycleB.оборудование для EquipmentA

У кого-нибудь есть идеи? Я погуглил, но ничего не нашел. Может ли это быть ошибка Hibernate / JPA?

Заранее спасибо за помощь

...