Ошибка при попытке вставить расширенный объект: недопустимый индекс столбца

У меня есть две сущности для двух классов. Первый является расширенным классом второго (шаблон Observer): Дочерний элемент:

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


person toscanelli    schedule 17.09.2015    source источник
comment
Какой SQL он использовал до обновления? Разве отображение дискриминатора не должно быть доступно только для чтения, поскольку предполагается, что оно контролируется наследованием Java? Попробуйте пометить его как insertable=false, updateable=false   -  person Chris    schedule 17.09.2015
comment
Пожалуйста, опубликуйте трассировку стека (по крайней мере, соответствующую часть). И укажите версию Hibernate. Я предполагаю, что это связано с использованием поля DiscrimatorColumn as - я не думаю, что это явно поддерживается где-либо (особенно для изменяемого поля). Если вам действительно нужно прочитать значение дискриминатора, вы можете использовать вместо него @Formula или у вас есть метод getDiscriminator(), который вы реализуете для каждого подкласса Observer. И вам не нужно определять InheritanceType дважды — используйте его только для корневого объекта.   -  person Tobias Liefke    schedule 17.09.2015
comment
Вы оба правы! Проблема была в отображении дискриминатора. Я добавил insertable=false, updateable=false и все работает! Я бы дал вам лучший ответ проверить, если бы я мог.   -  person toscanelli    schedule 17.09.2015
comment
insertable=false смешно (хотя правильно). Поскольку значение НЕ определено на стороне БД, оно ДОЛЖНО быть частью INSERT. Следовательно, вставка = ложь не имеет смысла :) Посмотрите в руководстве по @Column для этого свойства: включен ли столбец в операторы SQL INSERT, созданные поставщиком постоянства.   -  person Maksim Gumerov    schedule 30.01.2018


Ответы (2)


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

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

person Olcay Tarazan    schedule 15.04.2016

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

ОШИБКА SqlExceptionHelper: 146 - индекс столбца вне диапазона: 2, количество столбцов: 1

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

insertable = false и updatable = false

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

person dassum    schedule 07.09.2016