2017-10-28 92 views
2

我面临的一些问题与Hibernate,JPA,Maven的问题与方言的SQLite 3与Hibernate 5

这是我第一次使用JPA和休眠,我有一些问题: 我有,我有一个数据库用JPA创建,我想用JUnit5做一些CRUD测试。 使用pom.xml添加依赖项以使用SQLite方言和hibernate,并且我有一个persistence.xml文件。 我使用Eclipse运行该项目,看是否第一次简单的测试工作,我有这样的问题:

倍频程28,2017 2:42:32 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO:HHH000204:正在处理 PersistenceUnitInfo [name:Bla ...] oct。 28,2017 2:42:32 PM org.hibernate.Version logVersion信息:HHH000412:Hibernate Core {5.2.12.Final} oct。 28,2017 2:42:32 PM org.hibernate.cfg.Environment 信息:HHH000206:未找到hibernate.properties oct。 28,2017 2:42:32 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager INFO:HCANN000001:Hibernate Commons Annotations {5.0.1.Final} oct。 28,2017年下午2点42分33秒 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl 配置警告:HHH10001002:使用Hibernate内置的连接池 OCT(不用于生产使用!)。 28,2017年下午2点42分33秒 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO:HHH10001005:使用驱动器[org.sqlite.JDBC]在URL [JDBC:源码::存储器:]倍频程28,2017 2:42:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator信息:HHH10001001:连接属性:{charSet = UTF-8, password = ****,user = test }十月。 28,2017 2:42:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator信息:HHH10001003:自动提交模式:false oct。 28,2017 2:42:33 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections INFO:HHH000115:Hibernate连接池大小:20(min = 1) oct。 28,2017年下午2点42分33秒 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService WARN:HHH000342:无法获得连接以查询 元数据:无法确定方言使用[名称= SQLite的, majorVersion = 3];用户必须注册解析器或明确设置 'hibernate.dialect'线程中的异常“主” org.hibernate.service.spi.ServiceException:无法创建请求 服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment ] 在 。 。 。 引起:org.hibernate.HibernateException:访问 当'hibernate.dialect'未设置为 时,DialectResolutionInfo不能为空。 。 。 ... 14多个

所以我有我试图找出原因,我有:

警告:HHH000342:无法获得连接查询的元数据: 无法确定方言使用[名= SQLite,majorVersion = 3];用户 必须注册解析器或明确设置'休眠。方言'

显然这是因为SQLite 3和Hibernate 5不兼容,所以我试试这个:Does Hibernate Fully Support SQLite但它不适合我。

然后我尝试采用较低版本的hibernate,并在我的pom.xml中修改hibernate版本和hibernate-core版本至4.3.11.Final但同样,它不能解决我的问题。

上几个小时后,我无法弄清楚,如果问题来自休眠和SQLite的版本,或者如果这是在我的pom.xml配置的问题(一个丢失的依赖?)或这是我的persistance.xml,或者这来自我的类​​Test。

File tree of my project

请让我知道如果你需要更多的细节。 非常感谢您的帮助。

我的pom.xml文件:

<project 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>fr.umlv.orthopro</groupId> 
    <artifactId>OrthoPro_brain</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>OrthoPro_brain</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <java.version>9</java.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <junit.jupiter.version>5.0.1</junit.jupiter.version> 
    <junit.platform.version>1.0.1</junit.platform.version> 
    <hibernate.version>5.2.12.Final</hibernate.version> 
    <sqlite.version>3.20.1</sqlite.version> 
    </properties> 

    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.7.0</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
       <showWarnings>true</showWarnings> 
       <showDeprecation>true</showDeprecation> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-javadoc-plugin</artifactId> 
      <version>3.0.0-M1</version> 
      <configuration> 
       <reportOutputDirectory>${project.build.directory}/javadoc</reportOutputDirectory> 
       <destDir>javadoc</destDir> 
       <nohelp>true</nohelp> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    <dependencies> 
    <dependency> 
     <groupId>org.junit.jupiter</groupId> 
     <artifactId>junit-jupiter-engine</artifactId> 
     <version>${junit.jupiter.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.junit.platform</groupId> 
     <artifactId>junit-platform-runner</artifactId> 
     <version>${junit.platform.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.xerial</groupId> 
     <artifactId>sqlite-jdbc</artifactId> 
     <version>${sqlite.version}</version> 
     <!-- <scope>test</scope> --> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.persistence</groupId> 
     <artifactId>org.eclipse.persistence.jpa</artifactId> 
     <version>2.7.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.2.12.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.xml.bind</groupId> 
     <artifactId>jaxb-api</artifactId> 
     <version>2.3.0</version> 
    </dependency> 

    </dependencies> 
</project> 

我的persistence.xml文件:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
       http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
       version="2.1"> 

     <persistence-unit name="first_test" transaction-type="RESOURCE_LOCAL"> 
      <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
      <class>fr.umlv.orthpro.db.User</class> 
      <class>fr.umlv.orthpro.db.Rule</class> 
      <class>fr.umlv.orthpro.db.UserRule</class> 
      <class>fr.umlv.orthpro.db.Sentence</class> 

      <properties> 
       <property name="dialect" value="org.hibernate.dialect.SQLiteDialect" /> 
       <property name="javax.persistence.jdbc.driver" value="org.sqlite.JDBC" /> 
       <property name="javax.persistence.jdbc.url" value="jdbc:sqlite::memory:" /> 
       <property name="javax.persistence.jdbc.user" value="test" /> 
       <property name="javax.persistence.jdbc.password" value="test" /> 
       <property name="hibernate.show_sql" value="true" /> 
       <property name="format_sql" value="true" /> 
       <property name="hibernate.connection.charSet" value="UTF-8" /> 
       <property name="hibernate.hbm2ddl.auto" value="create" /> 
      </properties> 
     </persistence-unit> 
    </persistence> 

这是我的同班同学在数据库上运行测试:

package fr.umlv.orthopro.db; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

public class Test { 
     EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("first_test"); 

     EntityManager entitymanager = emfactory.createEntityManager(); 
     entitymanager.getTransaction().begin(); 

     User quentin = new User(); 
     quentin.setId(1201); 
     quentin.setAdmin(false); 

     entitymanager.persist(quentin); 
     entitymanager.getTransaction().commit(); 
     entitymanager.close(); 
     emfactory.close(); 
    } 
} 

编辑:我改变
<property name="dialect" value="org.hibernate.dialect.SQLiteDialect" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" /> ,现在我有这个:

无法解析名称[org.hibernate.dialect.SQLiteDialect]作为 策略[的org.hibernate.dialect.Dialect]

+0

几个轻量级Db有更好的意见:H2,德比aka JavaDB,HSQLDB与JPA –

+0

不幸的是我没有选择框架和数据库,我必须使用SQLite,但我知道有更多高效和简单的DB与JPA – Unconnu

+0

一起使用仅仅为了阐明:在persistence.xml中有一个'dialect'属性。它应该是'hibernate.dialect',是一个错字吗? – crizzis

回答

1

我正在使用的SQLite 3.10与Hibernate 5.2具有以下配置:

的pom.xml:

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>5.2.12.Final</version> 
</dependency> 
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc --> 
<dependency> 
    <groupId>org.xerial</groupId> 
    <artifactId>sqlite-jdbc</artifactId> 
    <version>3.20.1</version> 
    <scope>test</scope> 
</dependency> 
<!-- https://mvnrepository.com/artifact/com.zsoltfabok/sqlite-dialect --> 
<dependency> 
    <groupId>com.zsoltfabok</groupId> 
    <artifactId>sqlite-dialect</artifactId> 
    <version>1.0</version> 
</dependency> 

的persistence.xml:

<persistence version="2.1" 
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 

    <persistence-unit name="first_test" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="class" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" /> 
      <property name="hibernate.connection.driver_class" value="org.sqlite.JDBC" /> 
      <property name="hibernate.connection.username" value="" /> 
      <property name="hibernate.connection.password" value="" /> 
      <property name="hibernate.connection.user" value="" /> 
      <property name="hibernate.connection.autocommit" value="true"/> 
      <property name="hibernate.connection.url" value="jdbc:sqlite:sqlite.db"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.flushMode" value="ALWAYS" /> 
      <property name="hibernate.cache.use_second_level_cache" value="false" /> 
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" /> 

      <!-- create https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html --> 
      <property name="hibernate.hbm2ddl.auto" value="validate or create" /> 
     </properties> 
    </persistence-unit> 

</persistence> 

当然你要的hibernate.connection.urlhibernate.hbm2ddl.auto,也许其他属性的值更改为您的需求。