Error getting generated key or setting result to parameter object. Cause: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver #1028
Describe the bug
I was trying to get the ID of an inserted item using Mybatis. In the XML file, when I use keyProperty parameter, I get org.springframework.dao.InvalidDataAccessApiUsageException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver; not implemented by SQLite JDBC driver error.
To Reproduce
Playlist Entity is defined like this;
@Data
@AllArgsConstructor
public class Playlist {
private long id;
private String playlistName;
private String playlistUrl;
}
PlaylistRepository.java
@org.apache.ibatis.annotations.Mapper
public interface PlaylistRepository {
Long save(Playlist task);
}
PlaylistRepository.XML
<insert id="save" parameterType="com.prod.transponder.entity.Playlist" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into playlist (playlist_name, source_url) values
(#{playlistName}, #{playlistUrl})
</insert>
// No error if I omit the parameter `keyProperty`
The playlist table definition
drop table if exists playlist;
create table playlist(
id integer,
source_url text,
playlist_name text,
primary key(id)
);
Expected behavior
Add new item in playlist table with key auto-generated and the key being set to the object passed to the save method like this or this
Logs
Connected to the target VM, address: '127.0.0.1:57121', transport: 'socket'
23:00:32.194 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.prod.transponder.repository.PlaylstRepositoryTest]: PlaylstRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
23:00:32.338 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.prod.transponder.TransponderApplication for test class com.prod.transponder.repository.PlaylstRepositoryTest
2023-12-02T23:00:32.877+05:30 INFO 31209 --- [ main] c.p.t.r.PlaylstRepositoryTest : Starting PlaylstRepositoryTest using Java 17.0.8 with PID 31209 (started by aca in /home/aca/ideaProjects/satellite/transponder)
2023-12-02T23:00:32.879+05:30 INFO 31209 --- [ main] c.p.t.r.PlaylstRepositoryTest : No active profile set, falling back to 1 default profile: "default"
2023-12-02T23:00:34.315+05:30 INFO 31209 --- [ main] c.p.t.r.PlaylstRepositoryTest : Started PlaylstRepositoryTest in 1.755 seconds (process running for 3.198)
2023-12-02T23:00:34.331+05:30 INFO 31209 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2023-12-02T23:00:34.466+05:30 INFO 31209 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.sqlite.jdbc4.JDBC4Connection@79afa369
2023-12-02T23:00:34.478+05:30 INFO 31209 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
[]
2023-12-02T23:00:34.518+05:30 INFO 31209 --- [ main] c.p.transponder.TransponderApplication : jdbc:sqlite:/home/aca/ideaProjects/satellite/transponder/src/main/resources/static/test.db
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
org.springframework.dao.InvalidDataAccessApiUsageException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver
; not implemented by SQLite JDBC driver
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:106)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:116)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
at jdk.proxy2/jdk.proxy2.$Proxy62.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
at jdk.proxy2/jdk.proxy2.$Proxy73.save(Unknown Source)
at com.prod.transponder.repository.PlaylstRepositoryTest.should_saveTaskItem_when_calledSaveMethod(PlaylstRepositoryTest.java:24)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver
at org.sqlite.jdbc3.JDBC3PreparedStatement.unsupported(JDBC3PreparedStatement.java:448)
at org.sqlite.jdbc3.JDBC3Statement.getGeneratedKeys(JDBC3Statement.java:361)
at com.zaxxer.hikari.pool.ProxyStatement.getGeneratedKeys(ProxyStatement.java:229)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.getGeneratedKeys(HikariProxyPreparedStatement.java)
at org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.processBatch(Jdbc3KeyGenerator.java:79)
at org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.processAfter(Jdbc3KeyGenerator.java:71)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:52)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
... 10 more
2023-12-02T23:00:35.339+05:30 INFO 31209 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2023-12-02T23:00:35.342+05:30 INFO 31209 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
Disconnected from the target VM, address: '127.0.0.1:57121', transport: 'socket'
Process finished with exit code 255
Environment (please complete the following information):
Describe the bug I was trying to get the ID of an inserted item using
Mybatis
. In the XML file, when I usekeyProperty
parameter, I getorg.springframework.dao.InvalidDataAccessApiUsageException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver; not implemented by SQLite JDBC driver
error.To Reproduce Playlist Entity is defined like this;
PlaylistRepository.java
PlaylistRepository.XML
The
playlist
table definitionRelevant dependencies;
Expected behavior Add new item in playlist table with key auto-generated and the key being set to the object passed to the
save
method like this or thisLogs
Environment (please complete the following information):