Hibernate 5.3.1 Ошибка SQL: индекс столбца выходит за пределы диапазона: 4, количество столбцов: 3 - PullRequest
0 голосов
/ 10 сентября 2018

Почему Hibernate неправильно связывает мои значения параметров? Как прокомментировал неразрешенная проблема HHH-8020 , Hibernate 5.3.1 все еще дает мне ошибку (HHH000346, SQLState: 22023), когда определение @JoinTable названо в честь самого объединенного @Entity (что происходит иметь составной @EmbeddedId, из которых один атрибут упоминается как @JoinColumn(name="ref_name") в joinColumns={..} и inverseJoinColumns={..}):

@Embeddable
public class MyCompositeId
{ 
    @Column(name = "ref_name") 
    private String name; 

    @Column(name = "partial_id") 
    private Integer id; 

    @Column(name = "extension_id") 
    private String extensionId; 
}

interface MyLinkedEntity { }

@Entity
@Table(name = "my_join_table")
class MyLinkedEntityImpl implements MyLinkedEntity
{ 
    @EmbeddedId 
    private MyCompositeId id; 

    @Column(name = "extension_value") 
    private byte[] extensionValue; 
}

@Entity
class MyEntry {

    @Id
    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, targetEntity = MyLinkedEntityImpl.class, cascade = CascadeType.ALL)
    @JoinTable(name = "my_join_table", 
        joinColumns = @JoinColumn(name = "ref_name", insertable = false, updatable = false),
        inverseJoinColumns = { 
            @JoinColumn(name = "extension_id", referencedColumnName = "extension_id"), 
            @JoinColumn(name = "partial_name", referencedColumnName = "partial_name"), 
            @JoinColumn(name = "ref_name", referencedColumnName = "ref_name"), 
        })
    private Set<MyLinkedEntity> linkedEntities = new HashSet<>();
}

Мои журналы показывают, что MyLinkedEntity сначала сохраняется полностью (с избыточностью), за ним снова следует реляционное отображение (т. Е. Без столбца extension_value) и привязка дублированного / ошибочного значения для столбца соединения ref_name (обратное) :

DEBUG - insert into my_join_table (extension_value, partial_id, extension_id, ref_name) values (?, ?, ?, ?) [at o.h.SQL.logStatement(SqlStatementLogger.java:94)]
TRACE - binding parameter [1] as [VARBINARY] - [[11, 12, 13, 14, 15]] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
TRACE - binding parameter [2] as [INTEGER] - [3] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
TRACE - binding parameter [3] as [VARCHAR] - [B] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
TRACE - binding parameter [4] as [VARCHAR] - [VWS1] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
:
DEBUG - insert into my_join_table (ref_name, partial_id, extension_id) values (?, ?, ?) [at o.h.SQL.logStatement(SqlStatementLogger.java:94)]
TRACE - binding parameter [1] as [VARCHAR] - [VWS1] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
TRACE - binding parameter [2] as [INTEGER] - [3] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
TRACE - binding parameter [3] as [VARCHAR] - [B] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
TRACE - binding parameter [4] as [VARCHAR] - [VWS1] [at o.h.t.d.s.BasicBinder.bind(BasicBinder.java:65)]
WARN - SQL Error: 0, SQLState: 22023 [at o.h.e.j.s.SqlExceptionHelper.logExceptions(SqlExceptionHelper.java:129)]
ERROR - The column index is out of range: 4, number of columns: 3. [at o.h.e.j.s.SqlExceptionHelper.logExceptions(SqlExceptionHelper.java:131)]
ERROR - HHH000346: Error during managed flush [org.hibernate.exception.DataException: could not insert collection: test.MyEntry.keys#ID] [at o.h.i.ExceptionMapperStandardImpl.mapManagedFlushFailure(ExceptionMapperStandardImpl.java:39)]

с фрагментом трассировки стека:

Caused by: org.hibernate.exception.DataException: could not insert collection: [MyEntry.linkedEntities#VWS1]
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:118)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1374)
    at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3278)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2474)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:98)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
    ... 40 more
Caused by: org.postgresql.util.PSQLException: The column index is out of range: 4, number of columns: 3.
    at org.postgresql.core.v3.SimpleParameterList.bind(SimpleParameterList.java:65)
    at org.postgresql.core.v3.SimpleParameterList.setStringParameter(SimpleParameterList.java:128)
    at org.postgresql.jdbc.PgPreparedStatement.bindString(PgPreparedStatement.java:1023)
    at org.postgresql.jdbc.PgPreparedStatement.setString(PgPreparedStatement.java:344)
    at org.postgresql.jdbc.PgPreparedStatement.setString(PgPreparedStatement.java:328)
...