2017-02-10 52 views
1

我在使用Apache Derby Embedded數據庫和Hibernate的Spring Boot應用程序中向表中添加記錄時遇到了問題。在Apache Derby Embedded上調用last_insert_id()時出現Hibernate異常

實體:

@Entity 
@Table(name = "fm_stations") 
public class FmStation { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "st_id") 
    private Integer id; 

    public Integer getId() { 
     return id; 
    } 

    public FmStation setId(Integer id) { 
     this.id = id; 
     return this; 
    } 

    .......... 
} 

存儲庫:

public interface FmStationsRepository extends CrudRepository<FmStation, Integer> {} 

處理代碼:

@Autowired 
private FmStationsRepository fmStationsRepository; 

............... 

FmStation fmStation = new FmStation() 
         .setName(splStation[0]) 
         .setStationParams(station); 
fmStationsRepository.save(fmStation); 

............... 

性質:

spring.datasource.driver-class-name = org.apache.derby.jdbc.EmbeddedDriver 
spring.jpa.database-platform  = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.show-sql     = true 
spring.jpa.hibernate.ddl-auto  = update 

當hibernate運行last_insert_id()函數時,我在save方法中出現異常。這個例外看起來像:

Hibernate: insert into fm_stations (st_name, st_params) values (?, ?) 
Hibernate: select last_insert_id() 
2017-02-10 16:22:44.151 WARN 8204 --- [  Thread-4] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 20000, SQLState: 42X01 
2017-02-10 16:22:44.151 ERROR 8204 --- [  Thread-4] o.h.engine.jdbc.spi.SqlExceptionHelper : Syntax error: Encountered "<EOF>" at line 1, column 23. 
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select last_insert_id()]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement 
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:236) 
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:219) 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:488) 
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) 
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
at com.sun.proxy.$Proxy99.save(Unknown Source) 
at by.virkom.skss.ctm.component.thread.DvbStationsScanner.run(DvbStationsScanner.java:51) 
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement 
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:78) 
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:67) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2855) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3426) 
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:623) 
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:277) 
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:258) 
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:303) 
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182) 
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113) 
at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67) 
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) 
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) 
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:765) 
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:750) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298) 
at com.sun.proxy.$Proxy87.persist(Unknown Source) 
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:508) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.executeMethodOn(RepositoryFactorySupport.java:554) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:539) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:480) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
... 10 more 
Caused by: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "<EOF>" at line 1, column 23. 
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) 
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) 
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) 
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source) 
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source) 
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source) 
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source) 
at org.apache.derby.impl.jdbc.EmbedPreparedStatement42.<init>(Unknown Source) 
at org.apache.derby.jdbc.Driver42.newEmbedPreparedStatement(Unknown Source) 
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source) 
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) 
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) 
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) 
at com.sun.proxy.$Proxy68.prepareStatement(Unknown Source) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172) 
... 53 more 
Caused by: ERROR 42X01: Syntax error: Encountered "<EOF>" at line 1, column 23. 
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) 
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) 
at org.apache.derby.impl.sql.compile.ParserImpl.parseStatementOrSearchCondition(Unknown Source) 
at org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(Unknown Source) 
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source) 
at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source) 
at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source) 
... 68 more 

有人可以幫我解決這個問題嗎?

P.S .:當我嘗試添加行時,表爲空。

+2

您使用的是MySQL5Dialect之一,但你的數據庫是不是MySQL5的,這是德比。所以基本上,你想和一個法國人說中文。如果你和中國人說中文,法語跟法語夥伴說話,那會更好。 –

+0

是的你是對的。從另一個項目複製配置時,我確實忘了這一點。謝謝。 – Virkom

回答

相關問題