JPA / Hibernate: java.sql.SQLException: неверный аргумент в вызове JDBC: индекс параметра вне диапазона - PullRequest
0 голосов
/ 24 октября 2011

Я использую Hibernate 4 с простой «таблицей соединений» между двумя другими таблицами.Вот совместимые с JPA 1.0 сущности:

@Entity
@Table(name = "Companies")
public class Company
{
    @Id
    @Column
    private Integer id;

    @Column
    private String name;

    ...
}

и

@Entity
@Table(name = "PQs")
public class PQ implements Serializable
{
    @Id
    @Column
    private Integer id;

    @Column
    private String name;

    ...
}

Как вы можете видеть две подобные таблицы, просто простой идентификатор плюс имя.Теперь подключаемая сущность:

@Entity
@Table(name = "Partnerships")
@IdClass(value = PartnershipId.class)
public class Partnership implements Serializable
{
    @Id
    @Column(name = "pq_id", insertable = false, updatable = false)
    private Integer pqId;

    @Id
    @Column(name = "company_id", insertable = false, updatable = false)
    private Integer companyId;

    @Column(name = "ordinal_nbr")
    private Integer ordinalNbr;

    @ManyToOne
    @JoinColumn(name = "pq_id", referencedColumnName = "id")
    private PQ pq;

    @ManyToOne
    @JoinColumn(name = "company_id", referencedColumnName = "id")
    private Company company;

    ...
}

Обратите внимание на ... , insertable = false, updatable = false здесь @Column.

public class PartnershipId implements Serializable
{
    private Integer pqId;

    private Integer companyId;

    public PartnershipId()
    {
    }

    public PartnershipId(Integer pqId, Integer companyId)
    {
        this.pqId = pqId;
        this.companyId = companyId;
    }

    ...
}

При выполнении следующего кода теста

public class Main
{
    private static String PERSISTENCE_UNIT_NAME = "standalonePu";

    private static EntityManagerFactory emf;
    private static EntityManager em;
    private static EntityTransaction trans;

    public static void main(String[] args)
    {
        setUp(PERSISTENCE_UNIT_NAME);
        trans.begin();

        PQ detachedPq = new PQ(1, "Test PQ");
        Company detachedCompany = new Company(1, "Test Company");

        PQ pq = em.merge(detachedPq);
        Company company = em.merge(detachedCompany);

        Partnership detachedPartnership = new Partnership(1, 1, 1);
        detachedPartnership.setPQ(pq);
        detachedPartnership.setCompany(company);

        Partnership partnership = em.merge(detachedPartnership);

        partnership = em.find(Partnership.class, new PartnershipId(1, 1));

        System.out.println("Persistent partnership = ("
            + partnership.getPQId() + ", "
            + partnership.getCompanyId() + ", "
            + partnership.getOrdinalNbr() + ")");

        trans.commit();
        close();
    }

    private static void setUp(String puName)
    {
        emf = Persistence.createEntityManagerFactory(puName);
        em = emf.createEntityManager();
        trans = em.getTransaction();
    }

    private static void close()
    {
        em.close();
        emf.close();
    }
}

... Hibernate завершается с очень странным исключением на trans.commit();:

ERROR: Invalid argument in JDBC call: parameter index out of range: 4
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:90)
    at main.Main.main(Main.java:44)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Invalid argument in JDBC call: parameter index out of range: 4
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1347)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1280)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:78)
    ... 1 more
Caused by: org.hibernate.exception.GenericJDBCException: Invalid argument in JDBC call: parameter index out of range: 4
    at org.hibernate.exception.internal.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:148)
    at org.hibernate.exception.internal.SQLStateConverter.convert(SQLStateConverter.java:136)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:124)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:131)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:80)
    at $Proxy12.setInt(Unknown Source)
    at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:57)
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:82)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300)
    at org.hibernate.type.ComponentType.nullSafeSet(ComponentType.java:358)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2599)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2836)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3276)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:80)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:273)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:265)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:186)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1084)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:319)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:100)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:173)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)
    ... 1 more
Caused by: java.sql.SQLException: Invalid argument in JDBC call: parameter index out of range: 4
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.outOfRangeArgument(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.checkSetParameterIndex(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setInt(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:124)
    ... 22 more
Caused by: org.hsqldb.HsqlException: Invalid argument in JDBC call: parameter index out of range: 4
    at org.hsqldb.error.Error.error(Unknown Source)
    ... 31 more

Протестированная конфигурация - Hibernate 4.0.0.CR4 и HSQLDB 2.0.Я также проверил это с MySQL 5 с очень одинаковым JDBC-исключением, поэтому очевидно, что Hibernate генерирует неправильный код.

Обходной путь для решения этой проблемы - поместить ..., insertable = false, updatable = false в отношения'@JoinColumn с, но это не совсем то, что я хочу.

Итак, это ошибка Hibernate?Приведенный выше код должен быть верным с точки зрения JPA ...

1 Ответ

5 голосов
/ 24 октября 2011

Это ошибка:

https://hibernate.onjira.com/browse/JPA-24

Я проверил это с помощью эталонной реализации JPA EclipseLink 2.3, и она отлично работает.

...