美文网首页
Hibernate之配置信息

Hibernate之配置信息

作者: 紫荆秋雪_文 | 来源:发表于2019-09-29 00:05 被阅读0次

一、hibernate.cfg.xml

根据对象和映射文件,在创建SessioFactory的时候,可以生成对应的数据表

hibernate.hbm2ddl.auto=create:删除并创建表
hibernate.hbm2ddl.auto=update:更新表结构
hibernate.hbm2ddl.auto=validate:验证表结构,如果表结构和映射文件不匹配,Hibernate启动失败

1、*.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="com.revanwang._01.crud.domain">

    <class name="User" table="t_user">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>

        <property name="name" column="name"/>
        <property name="date" column="date"/>
    </class>

</hibernate-mapping>
  • 1、package是可以不写的,如果不写package,其中所有的类都必须有全限定名
  • 2、在一个hbm.xml中,可以写多个对象的映射,但是一般来说,一个映射文件对应一个对象。建议和类名相同(User.java—>User.hbm.xml)
  • 3、class元素的table属性是可以省略的,如果不写table属性值,对应table的名称和类的名称一模一样(大小写一样)
  • 4、property元素对应的是对象的属性:fullName
    • 4.1:什么是属性:由一对符合命名规范的getter和setter构成的;Hibernate找的是getter和setter
    • 4.2:Hibernate什么时候使用getter:把对象—>数据库中,getter方法返回的内容就是要保存到数据库中的内容
    • 4.3:Hibernate什么时候使用setter:数据库—>对象中,setter方法传入的值就是数据库中的值
    • 4.4:Hibernate不关心getter和setter方法的可见性(不关心getter/setter的访问权限)
  • 5、可以通过修改property元素的access属性来改变访问策略(访问属性/字段)
使用字段来关联表字段
<property name="bornDate" access="field"/>
  • 6、property元素的type属性可以为对象的属性添加指定的映射类型,type里面写的类型,不是数据库的类型,而是Hibernate定义的一种中间类型。
  • 7、为列添加更多的额外控制,在property元素的子元素column中,可以添加更多的列的约束控制条件
  • 8、控制属性的可变性:insert属性决定该列是否出现在INSERT语句中<property name="" insert = "true">:有值就出现在SQL语句,没有值就不出现
    • 8.1:<property name="" insert = "true">
    • 8.2:<class name="User" dynamic-insert="true">
  • 9、auto-import:自动导入,Hibernate为其中的对象自动的起一个别名(默认就是类的名称,用于查询)
<hibernate-mapping auto-import="false">
<!-- 自己为类起别名 -->
<import class="com._520it.day1._03_config.Person" rename="Person2"/>

二、OID生成策略

主键(Primary Key:PK):在数据库表中能够唯一识别每一行记录的一个字段或者多个字段的组合

  • 主键特点:非空且唯一、简单、一般是使用一个列来表示主键

自然主键:主键具有业务含义,比如省份证号码、手机号码,需要手动输入

代理主键:主键没有业务含义,仅仅起唯一标识,一般由数据控服务器自动生成(推荐)

单字段主键:在一张表中使用某一列作为主键(推荐)

复合主键:在一张表中使用多列一起联合作为主键

  • 1、在Hibernate中,一个对象必须要有一个id,这个id对应数据库表中的主键
  • 2、在Hibernate中,把对象中对应数据表主键的属性,对象标识符OID
  • 3、OID可以是单个属性,也可以使用多个属性(复合主键)
  • 4、OID的重要作用:OID在Hibernate中唯一标识了一个对象
  • 5、单个OID都使用<id>元素来映射,name代表OID属性的名称,column表示对应表中主键的列名
  • 6、id元素都有一个generator子元素,规定了主键的生成策略
  • 7、自然主键:assigned,在保存之前必须手动设置值,assigned只针对自然主键,一般不用

三、代理主键生成方式

  • 让数据库生成
  • 让Hibernate生成

1、uuid:使用uuid作为主键值,必须要求OID类型是String

2、increment

  • 2.1:Hibernate生成主键
  • 2.2:先查询当前表id的最大值,自增1后作为当前对象的id
  • 2.3:主键类型可以递增,但是该主键生成策略不能使用在多个Hibernate实例

3、identity

  • 1、使用数据库本省的id生成策略:MySQL:auto_increment
  • 2、数据库本身必须支持id自增生成策略,Oracle不能使用

4、sequence

  • 1、使用序列生成id,如果只配置sequence,会创建一个默认的序列hibernate_sequence可以通过sequence参数来指定表对应的序列生成器的名字
<generator class="sequence">
    <param name="sequence">IDDOMAIN_SEQ</param>
</generator>
  • 2、数据库本身必须支持序列,(Oracle支持,MySQL不支持)

5、native:使用数据库本地的主键生成策略

  • 1、MySQL使用:auto_increment
  • 2、Oracle:使用默认的hibernate_sequence

6、org.hibernate.id.enhanced.TableGenerator

  • 1、相当于序列生成器,hibernate使用一张hibernate_seqences这样的表来模拟序列生成器
  • 2、,如果只配置org.hibernate.id.enhanced.TableGenerator,相当于所有的表都使用default这一个序列生成器
<generator class="org.hibernate.id.enhanced.TableGenerator">
     <param name="segment_value">IDDOMAIN_SEQ</param>
</generator>
  • 3、会造成很多额外的SQL

相关文章

网友评论

      本文标题:Hibernate之配置信息

      本文链接:https://www.haomeiwen.com/subject/jsuructx.html