Skip to Content
0
Former Member
Apr 05, 2013 at 11:54 PM

HANA JDBC support for prepareStatement(String sql, int autoGeneratedKeys)

243 Views

Hi,

Our application is connecting to a HANA database via Hibernate (we are using the SAPDBDialect).

I am able to read, update and delete records.

For create, we use a database sequence (running number) to get the id which will be used as the primary key of the new record being inserted.

<table name="TABLE1">

<meta attribute="implements">Object1</meta>

<primary-key>

<generator class="sequence-identity">

<param name="sequence">PK_SEQ</param>

</generator>

<key-column name="ID" type="java.lang.Long"/>

</primary-key>

<column name="SEQ" type="java.lang.Short"/>

<column name="MIN_RANGE" type="java.lang.Short"/>

......

Above is the hibernate configuration that allows us to do this in ONE call with Oracle.

I know the call translates to the following JDBC call

prepareStatement(String sql, int autoGeneratedKeys)

With Hana, we get the following exception

java.lang.UnsupportedOperationException: Retrieving auto generated keys is not supported.

at com.sap.db.jdbc.ConnectionSapDB.prepareStatement(ConnectionSapDB.java:2113)

at com.sap.db.jdbc.trace.Connection.prepareStatement(Connection.java:375)

at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:418)

at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:385)

at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:527)

at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:131)

at org.hibernate.id.SequenceIdentityGenerator$Delegate.prepare(SequenceIdentityGenerator.java:99)

at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:54)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2345)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852)

at org.hibernate.impl.StatelessSessionImpl.insert(StatelessSessionImpl.java:112)

at org.hibernate.impl.StatelessSessionImpl.insert(StatelessSessionImpl.java:97)

at com.signaldemand.ui.struts.module.config.CreateAction.executeImpl(CreateAction.java:157)

at com.signaldemand.ui.struts.module.config.CrudDataAction.execute(CrudDataAction.java:72)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)

at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)

at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)

It seems HANA JDBC driver does not support prepareStatement(String sql, int autoGeneratedKeys).

Can someone confirm? If so, is there a plan to fix this?

We don't really want to do it in 2 separate calls/steps

a) get the next number from running sequence

b) insert the record with id and other values

Thanks!

Amit