使用Hibernate 5的方言SQLite 3的问题



我在使用Hibernate JPA Maven 时遇到了一些问题

这是我第一次使用JPA和hibernate,我遇到了一些问题:我有一个用JPA创建的数据库,我想用JUnit5对它进行一些CRUD测试。使用pom.xml,我添加了使用SQLite方言和hibernate的依赖项,并且我有一个persistence.xml文件。我使用Eclipse来运行项目,看看第一个简单的测试是否有效,我遇到了这个问题:

oct。2017年28日下午2:42:32 org.hibernate.jpa.internal.util.LogHelperlogPersistenceUnitInformation信息:HHH000204:正在处理PersistenceUnitInfo〔名称:Bla…〕2017年10月28日下午2:42:32org.hibernate.Version log版本信息:HHH000412:休眠内核{5.2.12.决赛}2017年10月28日下午2:42:32 org.hibernate.cfg.Environment信息:HHH000206:hibernate.properties找不到2017年10月28日下午2:42:32org.hubinate.annotations.common.reflection.java.JavaReflectionManager信息:HCANN000001:休眠公用注释{5.0.1.决赛}2017年10月28日下午2:42:33org.hubinate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImplconfigure WARN:HHH10001002:使用Hibernate内置连接池(非生产用途!)2017年10月28日下午2:42:33org.hubinate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImplbuildCreator信息:HHH10001005:在URL处使用驱动程序[org.sqlite.JDBC][jdbc:sqlite::memory:]2017年10月28日下午2:42:33org.hubinate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImplbuildCreator信息:HHH10001001:连接属性:{charSet=UTF-8,密码=***,用户=测试}2017年10月28日下午2:42:33org.hubinate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImplbuildCreator信息:HHH10001003:自动提交模式:false 2017年10月28日下午2:42:33org.hubinate.engine.jdbc.connections.internal.PooledConnections信息:HHH000115:休眠连接池大小:20(最小值=1)2017年10月28日下午2:42:33org.hubinate.engine.jdbc.env.internal.JdbcEnvironmentInitiatorinitiateService警告:HHH000342:无法获得要查询的连接元数据:无法确定要使用的方言[名称=SQLite,majorVersion=3];用户必须注册冲突解决程序或显式设置'hibernate.方言'线程"main"中出现异常org.hubinate.service.spi.ServiceException:无法创建请求的service[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment],位于。引起原因:org.hibernate异常:访问未设置"hibernate.方言"时,DialectResolutionInfo不能为null在再增加14个

所以我试着找出我为什么有:

警告:HHH000342:无法获得查询元数据的连接:无法确定要使用的方言[名称=SQLite,主要版本=3];使用者必须注册冲突解决程序或显式设置"hibernate.方言">

显然这是因为SQLite 3和Hibernate 5不兼容,所以我尝试这样做:Hibernate完全支持SQLite吗,但它对我不起作用。

然后,我尝试使用hibernate的较低版本,并在pom.xml中将hibernate版本和hibernate核心版本修改为4.3.11。最终,它并没有解决我的问题。

经过几个小时的讨论,我不知道问题是来自hibernate和SQLite版本,还是pom.xml中的配置问题(缺少依赖项?),还是我的persistence.xml,或者这来自我的类Test。

我的项目的文件树

如果你需要更多的细节,请告诉我。提前感谢您的帮助。

我的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.方言.SQLiteDialect]解析为strategy[org.hibernate.方言.方言]

我使用的是带有以下配置的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的值,也许还需要更改其他属性。

最新更新