2015-09-17 5 views
0

У меня есть два объекта для двух классов. Первый представляет собой расширенный класс второго (паттерн наблюдателя): Ребенок:Ошибка при попытке вставить расширенный объект: недопустимый индекс столбца

@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

+1

Каким SQL был использован до обновления? Не должно ли отображение дискриминатора быть только для чтения, поскольку оно должно контролироваться наследованием Java? Попробуйте пометить его как insertable = false, updatable = false – Chris

+0

Пожалуйста, разместите stacktrace (по крайней мере, соответствующую часть). И укажите версию Hibernate. Я бы предположил, что это связано с использованием поля DiscrimatorColumn как поля - я не думаю, что это поддерживается явно где угодно (особенно для изменяемого поля). Если вам действительно нужно прочитать значение дискриминатора, вместо этого вы можете использовать '@ Formula', или у вас есть метод' getDiscriminator() ', который вы реализуете для каждого подкласса Observer. И вам не нужно определять «InheritanceType» дважды - используйте его только для корневого объекта. –

+0

Оба вы правы! Проблема заключалась в сопоставлении дискриминаторов. Я добавил insertable = false, updatable = false, и он работает! Я бы дал вам «лучший ответ», если бы мог. – toscanelli

ответ

1

является @ Крис правильно. Когда я обновить Jboss7 до Wildfly10, заметил эту ошибку и фиксируется путем обновления дискриминатора

@Column(name = "INPUT_TYPE", nullable = false, length = 6, insertable = false, updatable = false) public String getInputType() { return inputType; }

0

Я столкнулся с той же проблемой:

ERROR SqlExceptionHelper:146 - The column index is out of range: 2, number of columns: 1

Когда я модернизировал версию JPA добавить следующие два атрибута к дискриминатор колонка:

insertable = false и updatable = false

Ранее это было по умолчанию.

Смежные вопросы