Наличие свойства hibernate.globally_quoted_identifiers заставляет BoneCPDataSource не находить com.microsoft.sqlserver.jdbc.SQLServerDriver

У меня есть приложение, которое использует Spring с Hibernate для подключения к MS SQL Server.

Приложение подключается нормально без этого свойства:

<prop key="hibernate.globally_quoted_identifiers">true</prop>

Однако мне нужно это свойство, так как некоторые имена / столбцы таблиц имеют зарезервированные имена, и я не хочу избегать их всех.

Конфигурация:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mainDataSource" />
    <property name="packagesToScan" value="mypackage.entity" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">${jdbc.showSql}</prop>
            <prop key="hibernate.format_sql">${jdbc.showSql}</prop>
            <prop key="hibernate.use_sql_comments">${jdbc.showSql}</prop>
            <prop key="hibernate.globally_quoted_identifiers">true</prop>
        </props>
    </property>
</bean>



<!-- BoneCP configuration -->
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
   <property name="driverClass" value="${jdbc.driverClassName}" />
   <property name="jdbcUrl" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}"/>
   <property name="password" value="${jdbc.password}"/>
   <property name="idleConnectionTestPeriodInMinutes" value="60"/>
   <property name="idleMaxAgeInMinutes" value="240"/>
   <property name="maxConnectionsPerPartition" value="50"/>
   <property name="minConnectionsPerPartition" value="5"/>
   <property name="partitionCount" value="3"/>
   <property name="acquireIncrement" value="5"/>
   <property name="statementsCacheSize" value="100"/>
   <property name="releaseHelperThreads" value="3"/>
</bean>

Все свойства установлены. Я использую sqljdbc4.2. jdbc.driverClassName установлен в com.microsoft.sqlserver.jdbc.SQLServerDriver, JAR находится в папке WEB-INF/lib, пути к классам и в папке $CATALINA_HOME/lib. Это прекрасно работает без globally_quoted_identifiers свойство, но я не могу понять, почему его добавление вызывает BoneCPDataSource не быть в состоянии найти водителя. Вот сообщение об ошибке:

Caused by: org.hibernate.MappingException: Unable to find column with logical name: my_entity_id in org.hibernate.mapping.Table(my_entity) and its related supertables and secondary tables
    at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:559)
    at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:258)
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116)
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1596)
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1519)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1420)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    ... 33 more
[ERROR] 06/12/2016 10:44:15 [BoneCP-pool-watch-thread] [(ConnectionHandle:229)] Failed to acquire connection. Sleeping for 7000ms. Attempts left: 5
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost:1433;databaseName=SDC-Prod
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:256)
    at com.jolbox.bonecp.ConnectionHandle.obtainInternalConnection(ConnectionHandle.java:211)
    at com.jolbox.bonecp.ConnectionHandle.<init>(ConnectionHandle.java:170)
    at com.jolbox.bonecp.PoolWatchThread.fillConnections(PoolWatchThread.java:101)
    at com.jolbox.bonecp.PoolWatchThread.run(PoolWatchThread.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[ERROR] 06/12/2016 10:44:15 [BoneCP-pool-watch-thread] [(CustomThreadFactory:89)] Uncaught Exception in thread BoneCP-pool-watch-thread
java.lang.NoClassDefFoundError: com/jolbox/bonecp/hooks/ConnectionState
    at com.jolbox.bonecp.ConnectionHandle.markPossiblyBroken(ConnectionHandle.java:291)
    at com.jolbox.bonecp.ConnectionHandle.obtainInternalConnection(ConnectionHandle.java:241)
    at com.jolbox.bonecp.ConnectionHandle.<init>(ConnectionHandle.java:170)
    at com.jolbox.bonecp.PoolWatchThread.fillConnections(PoolWatchThread.java:101)
    at com.jolbox.bonecp.PoolWatchThread.run(PoolWatchThread.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: com.jolbox.bonecp.hooks.ConnectionState
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
    ... 8 more

Казалось, что таблица поиска не работает, потому что она не может подключиться, но просто не может найти связь между globally_quoted_identifiers и классом драйвера.

0 ответов

Другие вопросы по тегам