Hibernate 5 проблема конверсионной вставки - PullRequest
1 голос
/ 14 июня 2019

Я работаю над приложением, которое мы конвертируем из Hibernate 3.4 в 5.4 (и Spring 3.4 в 5.4).Это сервер WLS 19.0.0.4 с java 8, соединяющейся с базой данных DB2.При вставке в базу данных возникает ошибка «HIBERNATE_SEQUENCE IS UNDEFINED NAME» (трассировка стека ниже).Это в состоянии получить.

Есть ли изменение синтаксиса для вставок или значений генерирующей последовательности или каких-либо других изменений, которые я не рассматриваю в Hibernate 5?

Я исследовал и обнаружил, что SQLCODE = -204, SQLSTATE = 42704 указывает на «объект не существует», но я не думаю, что это связано с IBM, только потому, что я мог делать вставки на него, когда он былSpring / Hibernate 3.4

Jibernate и постоянные jars hibernate-core-5.4.2.Final.jar javax.persistence-api-2.2.jar (это заменило ejb3-persistence-1.0.2.GA.jar из-законфликт, который я видел)

Пример hbm.xml.Это образец нашего подхода.Это происходит со всеми вставками

  <class name="somepath.TableLog" table="TABLE_NAME">

    <id name="id" type="java.lang.Long" access="field">
        <column name="SYS_ID" />
        <generator class="sequence">
            <param name="sequence">TABLE_LOG_SEQ</param>
        </generator>
    </id>
    <property name="logEntry" type="java.lang.String" access="field">
        <column name="LOG_ENTRY" length="32000" />
    </property>
    <property name="userId" type="java.lang.String" access="field">
        <column name="USER_ID" length="2" />
    </property>

</class>

Соответствующий класс - методы получения и установки для logEntry находятся в родительском классе.

public class TableLog extends AbstractLog {

    private String userId = "";
    public TableLog (String logEntry,  String userId) {
        super(logEntry, userId);
    }
    /**
     * Instantiates a new sys mgmt log.
     */
    public TableLog() {
        super();                
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

}

hibernate-hsqldb.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <!-- Database connection settings -->
        <property name="hibernate.connection.datasource">some jndi</property>
        <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</property>
        <property name="connection.driver_class">com.ibm.db2.jcc.DB2ConnectionPoolDataSource</property>

        <!-- <property name="hibernate.default_schema">MWKDB2MV</property> -->

        <property name="current_session_context_class">thread</property>

        <property name="hibernate.dialect">tus.persist.util.impl.Db2390DialectSequenceFix</property>

        <property name="current_session_context_class">thread</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">false</property>
        <!-- Drop and re-create the database schema on startup -->
        <!--property name="hibernate.hbm2ddl.auto">create</property-->

    </session-factory>
</hibernate-configuration>

трассировка стека ошибок:

[ERROR][Default Executor-thread-130] TableStructure$1$1: could not read a hi value
com.ibm.db2.jcc.am.vo: (schema).HIBERNATE_SEQUENCE IS AN UNDEFINED NAME. SQLCODE=-204, SQLSTATE=42704, DRIVER=4.8.86
    at com.ibm.db2.jcc.am.gd.a(gd.java:676)
    at com.ibm.db2.jcc.am.gd.a(gd.java:60)
    at com.ibm.db2.jcc.am.gd.a(gd.java:127)
    at com.ibm.db2.jcc.am.wm.c(wm.java:2510)
    at com.ibm.db2.jcc.am.wm.d(wm.java:2498)
    at com.ibm.db2.jcc.am.wm.a(wm.java:1978)
    at com.ibm.db2.jcc.am.wm.a(wm.java:1956)
    at com.ibm.db2.jcc.t4.fb.g(fb.java:135)
    at com.ibm.db2.jcc.t4.fb.a(fb.java:40)
    at com.ibm.db2.jcc.t4.t.a(t.java:32)
    at com.ibm.db2.jcc.t4.ub.i(ub.java:135)
    at com.ibm.db2.jcc.am.wm.hb(wm.java:1949)
    at com.ibm.db2.jcc.am.xm.pc(xm.java:2996)
    at com.ibm.db2.jcc.am.xm.b(xm.java:3766)
    at com.ibm.db2.jcc.am.xm.bc(xm.java:692)
    at com.ibm.db2.jcc.am.xm.executeQuery(xm.java:662)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:476)
    at org.hibernate.id.enhanced.TableStructure.executeQuery(TableStructure.java:216)
    at org.hibernate.id.enhanced.TableStructure.access$300(TableStructure.java:46)
    at org.hibernate.id.enhanced.TableStructure$1$1.execute(TableStructure.java:138)
    at org.hibernate.id.enhanced.TableStructure$1$1.execute(TableStructure.java:126)
    at org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:55)
    at org.hibernate.jdbc.AbstractReturningWork.accept(AbstractReturningWork.java:34)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:57)
    at org.hibernate.id.enhanced.TableStructure$1.getNextValue(TableStructure.java:125)
    at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40)
    at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:520)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:119)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:97)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:682)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:674)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:669)
    at sun.reflect.GeneratedMethodAccessor1359.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Method.java:508)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350)
    at com.sun.proxy.$Proxy62.saveOrUpdate(Unknown Source)
    at tus.persist.service.impl.PersistenceService.executeSaveOrUpdateBusinessObject(PersistenceService.java:563)
    at tus.persist.service.impl.PersistenceService.execute_aroundBody20(PersistenceService.java:447)
    at tus.persist.service.impl.PersistenceService.execute_aroundBody21$advice(PersistenceService.java:56)
    at tus.persist.service.impl.PersistenceService.execute(PersistenceService.java:1)
    at tus.persist.request.impl.SaveOrUpdateBusinessObjectRequest.execute(SaveOrUpdateBusinessObjectRequest.java:48)
    at tus.persist.request.impl.SaveOrUpdateBusinessObjectRequest.execute(SaveOrUpdateBusinessObjectRequest.java:1)
    at fw.journaling.impl.HibernateLogProcessor.execute(HibernateLogProcessor.java:80)
    at aspect.impl.AbstractAspect.processSystemLogRequestMessage(AbstractAspect.java:240)
    at aspect.impl.AbstractProdStatisticsAspect.logSessionContextMessage(AbstractProdStatisticsAspect.java:75)
    at aspect.impl.SignInSignOffAspect.processLogSessionContextMessage(SignInSignOffAspect.java:98)
    at aspect.impl.SignInSignOffAspect.startSession(SignInSignOffAspect.java:143)
    at app.context.impl.SessionContext.myInit(SessionContext.java:117)
    at sun.reflect.GeneratedMethodAccessor1357.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Method.java:508)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1903)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1846)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:356)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$106.0000000022E64A30.getObject(Unknown Source)
    at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:45)
    at org.springframework.web.context.request.SessionScope.get(SessionScope.java:57)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:353)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:193)
    at com.sun.proxy.$Proxy35.getCurrentProcessContext(Unknown Source)
    at ui.handler.impl.ActionsHandler.getCurrentProcessContext(ActionsHandler.java:502)
    at ui.handler.impl.ActionsHandler.setupButtons(ActionsHandler.java:1096)
    at ui.page.BasePage.superRenderPreProcessing(BasePage.java:608)
    at sun.reflect.GeneratedMethodAccessor1351.invoke(Unknown Source)
    ...
[ WARN][Default Executor-thread-130] SqlExceptionHelper: SQL Error: -204, SQLState: 42704
[ERROR][Default Executor-thread-130] SqlExceptionHelper: (schema).HIBERNATE_SEQUENCE IS AN UNDEFINED NAME. SQLCODE=-204, SQLSTATE=42704, DRIVER=4.8.86
[ WARN][Default Executor-thread-130] SqlExceptionHelper: SQL Error: -516, SQLState: 26501
[ERROR][Default Executor-thread-130] SqlExceptionHelper: THE DESCRIBE STATEMENT DOES NOT SPECIFY A PREPARED STATEMENT. SQLCODE=-516, SQLSTATE=26501, DRIVER=4.8.86
[ WARN][Default Executor-thread-130] SqlExceptionHelper: SQL Error: -514, SQLState: 26501
[ERROR][Default Executor-thread-130] SqlExceptionHelper: THE CURSOR SQL_CURLH300C1 IS NOT IN A PREPARED STATE. SQLCODE=-514, SQLSTATE=26501, DRIVER=4.8.86
[ERROR][Default Executor-thread-130] PersistenceService: org.hibernate.exception.SQLGrammarException: error performing isolated work
[DEBUG][Default Executor-thread-130] TransactionImpl: rolling back
[DEBUG][Default Executor-thread-130] SynchronizationRegistryStandardImpl: Clearing local Synchronizations
[ERROR][Default Executor-thread-130] PersistenceService: fw.exception.impl.ApplicationException: org.hibernate.exception.SQLGrammarException: error performing isolated work

1 Ответ

1 голос
/ 27 июня 2019

Я нашел свой ответ по ссылке ниже.Моя настройка отличается тем, что мы используем имя последовательности из таблицы последовательности, однако эффект изменения значения по умолчанию для hibernate.id.new_generator_mappings вызвал ту же ошибку.(в Hib 3 это было ложно, в Hib 5 это правда).Поэтому ответ заключается в добавлении следующего свойства в hibernate.cfg.xml.Спасибо @Eva Mariam за этот ответ.

<property name="hibernate.id.new_generator_mappings">false</property>

Hibernate-последовательность не существует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...