Hibernate连接MySql5.7的部分问题

本文主要介绍了在使用Hibernate连接MySQL5.7时遇到的一些问题及解决方案,包括驱动版本匹配、数据库链接地址、时区设置、方言选择以及SSL配置。确保hibernate.cfg.xml配置文件位于正确位置,并根据需求调整相关属性,如使用正确的方言以支持InnoDB引擎。此外,还提到了未开启SSL验证时的警告和项目的目录结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先把解决问题的代码丢出来一下

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)

这个配置文件里面有几个地方说明一下

  1. 驱动版本
    > 驱动要和实际数据库版本匹配,不然会出错或者连接失败什么的
    > 5.7需要用到com.mysql.cj.jdbc.Driver而不是com.mysql.jdbc.Driver

  2. 数据库链接地址,

    用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

  3. 时区(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>

  4. 方言

    有部分朋友喜欢用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

  5. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值