2013-11-30 4 views
0

Я пытаюсь создать проект с Spring и JPA + Hibernate с базой данных MySQL, но всякий раз, когда я запускаю свой сервер (VMware vFabric tc Server, поставляется с STS) I бегите в следующей ошибки:Spring JPA + MySQL - Hibernate не удалось завершить обновление схемы

ERROR: HHH000299: Could not complete schema update 
java.lang.NullPointerException 
    at org.hibernate.tool.hbm2ddl.DatabaseMetadata.initSequences(DatabaseMetadata.java:182) 

я использую следующую конфигурацию:

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <!-- Database Configuration --> 
    <import resource="classes/config/spring/beans/DataSource.xml"/> 
    <import resource="classes/config/spring/beans/HibernateSessionFactory.xml"/> 

    <!-- Security Configuration --> 
    <import resource="springSecurityContext.xml" /> 

    <context:component-scan base-package="eu.shishigami" /> 

    <context:annotation-config /> 

</beans> 

DataSource.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 

    <bean 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"> 
      <value>WEB-INF/classes/config/database/db.properties</value> 
     </property> 
    </bean> 

    <bean id="dataSourceTemplate" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
     destroy-method="close"> 
     <property name="dataSource" ref="dataSourceTemplate" /> 
    </bean> 

    <bean id="jpaVendorAdapter" 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="showSql" value="true" /> 
     <property name="generateDdl" value="true" /> 
    </bean> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="hibernate-unit" /> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

</beans> 

db.properties

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/mydb 
jdbc.username=root 
jdbc.password=password 

HibernateSessionFactory.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 

     <property name="dataSource"> 
      <ref bean="dataSource" /> 
     </property> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> 
      </props> 
     </property> 

    </bean> 

</beans> 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 

    <persistence-unit name="hibernate-unit" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
     </properties> 
    </persistence-unit> 

</persistence> 

"MYDB" существует и запущен сервер MySQL.


Я нашел очень похож вопрос здесь: ERROR: HHH000299: Could not complete schema update java.lang.NullPointerException но я не мог получить, что ответ на работу:

Я заменил DataSource в моем DataSource.xml:

<bean id="dataSourceTemplate" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
    destroy-method="close"> 
    <property name="dataSource" ref="dataSourceTemplate" /> 
</bean> 

с

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/mydb" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

и добавил это на мой web.xml:

<resource-ref> 
    <description>MySQL Development DataSource</description> 
    <res-ref-name>mydb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

Затем я изменил расположение сервера в STS «Использовать метаданные для работы (не изменяет установку дц сервера» и модифицировал context.xml и server.xml в VFabric-дц-сервера разработчика-2.9.3. РЕЛИЗ \ базовый экземпляр \ CONF:

context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 

    <ResourceLink name="mydb" 
     type="javax.sql.DataSource" 
     global="mydb" /> 
</Context> 

server.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Server port="${base.shutdown.port}" shutdown="SHUTDOWN"> 

    ... 

    <GlobalNamingResources> 
     <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> 

     <Resource type="javax.sql.DataSource" name="mydb" 
      driverClassName="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost:3306/mydb" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" username="root" 
      password="password" idleMaxAge="240" idleConnectionTestPeriod="60" 
      partitionCount="3" acquireIncrement="5" maxConnectionsPerPartition="2" 
      minConnectionsPerPartition="1" statementsCacheSize="50" 
      releaseHelperThreads="5" /> 
    </GlobalNamingResources> 

    ... 

</Server> 

Я также скопировать MySQL-разъем -java-5.1.27.jar в следующих местах (я не был уверен, какой из них я должен скопировать его):

vfabric-tc-server-developer-2.9.3.RELEASE\base-instance\lib 
vfabric-tc-server-developer-2.9.3.RELEASE\tomcat-6.0.37.A.RELEASE\lib 
vfabric-tc-server-developer-2.9.3.RELEASE\tomcat-7.0.42.A.RELEASE\lib 

У меня есть разъем в моем pom.xml, а также (вот полный список моих зависимостей в случае, если я что-то упустил?)

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-oxm</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-beans</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context-support</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-expression</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>3.1.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>3.1.4.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>3.2.4.RELEASE</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.16</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.5</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.7.5</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
     <version>1</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>2.1.13</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>2.1.13</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.1</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.web</groupId> 
     <artifactId>el-impl</artifactId> 
     <version>2.2</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.el</groupId> 
     <artifactId>el-ri</artifactId> 
     <version>1.0</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.27</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>4.0</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>2.3</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>1.12.2</version> 
     <scope>provided</scope> 
    </dependency> 
    </dependencies> 

Для спящего режима, я скачал его и скопировал «необходимую» библиотеку и библиотеку EntityManager к Lib папке выше:

antlr-2.7.7.jar 
dom4j-1.6.1.jar 
hibernate-commons-annotations-4.0.2.Final.jar 
hibernate-core-4.2.7.Final.jar 
hibernate-entitymanager-4.2.7.Final.jar 
hibernate-jpa-2.0-api-1.0.1.Final.jar 
javassist-3.18.1-GA.jar 
jboss-logging-3.1.0.GA.jar 
jboss-transaction-api_1.1_spec-1.0.1.Final.jar 

После изменения моей конфиги, как предложено в другом потоке, я «м налево со следующим исключением при запуске сервера:

WARNING: Unexpected exception resolving reference 
java.sql.SQLException 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254) 

... 

Caused by: java.lang.NullPointerException 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:266) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) 

Спасибо за любую помощь, пожалуйста, скажите мне, если я что-то забыл.

+0

Ваша конфигурация довольно неясна. У вас есть 3 разных местоположения, в которых настроен hibernate: один раз в конфигурации Spring JPA (где вы говорите, что диалект Oracle, BTW), один раз в заводской конфигурации Spring (что используется этой конфигурацией?) И один раз настойчиво .xml (какой смысл использовать эту конфигурацию, если вы хотите настроить ее с помощью Spring)? –

+0

Спасибо за комментарий. Я не совсем понимаю, как правильно настроить это, поэтому я использовал множество разных источников и немного перепутал, полагаю. Я удалил persistence.xml и удалил hibernateProperties с моей фабрики сеансов. Я также изменил диалект оракула на MySQL, но при запуске он все еще показывает одно и то же исключение. Должен ли я обновлять исходный вопрос, чтобы отразить эти изменения? Еще раз спасибо за вашу помощь. – Shishigami

ответ

1

Трудно сказать, в чем проблема, но я попытался бы позволить hibernate создать создание базы данных SCRIPT вместо ее выполнения. И тогда я бы посмотрел на этот скрипт (или прервал его вручную), чтобы получить некоторый намек на то, какое отображение/таблица/последовательность является проблемой.

Для создания этого сценария вам потребуется несколько строк кода, вы можете найти один в Bozho's tech blog: How To Generate A Schema Creation Script With Hibernate 4, JPA And Maven

(У меня есть собственная программа создания сценария (то есть в его ядре, как Bozho), но он должен много специальных дополнительные возможности, но если вы не можете запустить скрипт Bozho, оставьте сообщение, и я упрощу свою программу и опубликую его)

+0

Большое спасибо за вашу помощь. Я скопировал класс и добавил плагин exec-maven в мою сборку в моем pom.xml, но я не совсем уверен, что делать после этого. Во-первых, $ {sql.generation.phase} вообще доступен или мне нужно определить его самостоятельно? Также, как мне выполнить этот плагин? Я попробовал Runs As -> Maven build и задал «process-classes» как цель, но похоже, что не запускал плагин (по крайней мере, я не вижу его в консоли). Извините за задание стольких вопросов. – Shishigami

+0

Вы должны реализовать этот короткий класс JpaSchemaExport и запустить его класс почты. - Тогда Maven - это еще один шаг, который вам не нужно идти. – Ralph

+0

Он работает без каких-либо исключений, но он ничего не делает. Я использовал «C: \\ schema.sql» в качестве адресата, это проблема? Спасибо за вашу помощь. – Shishigami

Смежные вопросы