先把解决问题的代码丢出来一下
src\test\resources\hibernate.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="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property><!-- ?characterEncoding=utf8&useSSL=false -->
<property name="connection.serverTimezone">Asia/Shanghai</property><!-- com\mysql\cj\jdbc\util\TimeZoneMapping.properties -->
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">utf8</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping resource="org/hibernate/tutorial/hbm/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这个文件要放在classpath的根目录下,让程序编译的时候可以找到它,我这里用的是maven项目,所以在resources目录下,当然如果是多个项目互相依赖的话,记得要调整maven配置,让maven打包发布的时候不要把这些xml文件丢了,会造成很奇怪的后果(调两天bug)
这个配置文件里面有几个地方说明一下
-
驱动版本
> 驱动要和实际数据库版本匹配,不然会出错或者连接失败什么的
> 5.7需要用到com.mysql.cj.jdbc.Driver
而不是com.mysql.jdbc.Driver
-
数据库链接地址,
用JDBC 的时候可以直接在链接后面添加?然后用&连接参数,但hibernate的配置文件允许,它另有含义,所以把重新写标签,上面是把各个参数拆出来写成标签了
就是从jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
变成了<property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.useUnicode">true</property> <property name="connection.characterEncoding">utf8</property>
如果需要更多的参数,就继续添加property标签并更改connection.xxx
-
时区(TimeZone)问题
Oracle公司意识到安全问题之后就给MySql添加了时区认证,所以没有添加时区会被拒绝服务
具体要用哪个时区可以到MySql的驱动包(connector)里
com\mysql\cj\jdbc\util\TimeZoneMapping.properties
寻找您的地区对应的代码
而中国的大可使用上海的时区
文件里的定义是China\ Standard\ Time=Asia/Shanghai
对应的字符串名是Asia/Shanghai
所以这里就用了<property name="connection.serverTimezone">Asia/Shanghai</property>
-
方言
有部分朋友喜欢用
org.hibernate.dialect.MySQLDialect
来配置,但在这里还是建议使用与实际使用版本相对应的方言类
我这个项目里用的是MySql 5.7,所以我用的是org.hibernate.dialect.MySQL57Dialect
作为方言,这样可以使用InnoDB作为引擎工作
打印的SQL会变成Hibernate: create table EVENTS (EVENT_ID bigint not null, EVENT_DATE datetime(6), title varchar(255), primary key (EVENT_ID)) engine=InnoDB
支持事务
当然,如果您的项目里有需要事务这个东西的话,大可随便一点,使用旧版的MyISAM引擎,它反而性能更高,能存储更多更多大的数据量(笑),当然也不排除后期Oracle公司优化做得好,把InnoDB的性能发挥到超过MyISAM -
SSL
Tue Feb 13 16:20:49 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
如果没有开启SSL验证,就会有这个警告
虽然有点恶心,但不影响本项目的进行,因为项目只是个demo,在本地机器上跑,就没有开启SSL、
但既然Oracle公司默认开启了SSL验证,说明它还是比较重要的,大家如果在部署环境中有SSL证书,可以再配置一下。
这里没有用到就不作解说
其他资料
-
本项目的目录结构
src
┣┯ java
┃┝ Event.java
┃┝ Event.hbm.xml
┃┕ NativeApiIllustrationTest.java
┗┯ resources
└ hibernate.cfg.xml -
MySql驱动版本
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>
-
MySql版本
5.7.21-log
-
实体类映射配置文件
Event.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.tutorial.hbm"> <class name="Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="increment"/> </id> <property name="date" type="timestamp" column="EVENT_DATE"/> <property name="title"/> </class> </hibernate-mapping>
-
Hibernate版本
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.13.Final</version> </dependency> <!-- Hibernate uses jboss-logging for logging, for the tutorials we will use the sl4fj-simple backend --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency>
参考链接:
http://blog.youkuaiyun.com/qq_36289559/article/details/70973041
https://stackoverflow.com/questions/24222718/failed-to-create-sessionfactory-object-org-hibernate-exception-jdbcconnectionexc
https://stackoverflow.com/questions/1273403/how-can-i-configure-hibernate-to-use-ssl-to-talk-to-the-db-server
http://blog.sina.com.cn/s/blog_667ac0360102e9wi.html