У меня есть два объекта для двух классов. Первый представляет собой расширенный класс второго (паттерн наблюдателя): Ребенок:Ошибка при попытке вставить расширенный объект: недопустимый индекс столбца
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue("User")
@Table(name="SCH.USER")
public class User extends Observer implements Serializable{
...fields...
}
И отец:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING)
@Table(name="SCH.OBSERVER")
public abstract class Observer implements Serializable{
@Id
@SequenceGenerator(name = "OBSERVER_ID_GENERATOR", sequenceName = "NEXO.SEQ_OBSERVER", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OBSERVER_ID_GENERATOR")
@Column(name="ID_OBSERVER")
private Long idObserver;
@Column(name = "DISCRIMINATOR", nullable=false, length=20)
private String discriminator;
}
Поскольку я модернизировал JPA 2.0 для JPA 2.1 Я не могу оставаться в дочерней сущности: em.persist (userInstance); который генерирует следующий SQL:
insert
into
NEXO.OBSERVER
(DISCRIMINATOR, ID_OBSERVER)
values
('User', ?)
И получает в результате ошибки:
java.sql.SQLException: invalid column index
Я уверен, что это изменение поведения было произведено при обновлении до JPA 2.1
Каким SQL был использован до обновления? Не должно ли отображение дискриминатора быть только для чтения, поскольку оно должно контролироваться наследованием Java? Попробуйте пометить его как insertable = false, updatable = false – Chris
Пожалуйста, разместите stacktrace (по крайней мере, соответствующую часть). И укажите версию Hibernate. Я бы предположил, что это связано с использованием поля DiscrimatorColumn как поля - я не думаю, что это поддерживается явно где угодно (особенно для изменяемого поля). Если вам действительно нужно прочитать значение дискриминатора, вместо этого вы можете использовать '@ Formula', или у вас есть метод' getDiscriminator() ', который вы реализуете для каждого подкласса Observer. И вам не нужно определять «InheritanceType» дважды - используйте его только для корневого объекта. –
Оба вы правы! Проблема заключалась в сопоставлении дискриминаторов. Я добавил insertable = false, updatable = false, и он работает! Я бы дал вам «лучший ответ», если бы мог. – toscanelli