美文网首页
java框架Hibernate的配置和映射属性

java框架Hibernate的配置和映射属性

作者: _琳哥 | 来源:发表于2017-11-21 15:11 被阅读34次

主配置参数详解及复合映射,集合映射

Hibernate.cfg.xml

主配置文件中主要配置:数据库连接信息、其他参数、映射信息!

  • 常用配置查看源码:
    • hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties

示例 :

<!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节点代表一个数据库-->
    <session-factory>
        <!-- 1.数据库连接配置-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://192.168.5.129:3306/partner</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">mysql</property>
        <!--数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- 2.其他相关配置-->
        <!--显示hibernate在运行时候执行sql语句-->
        <property name="hibernate.show_sql">true</property>
        <!--格式化sql-->
        <property name="hibernate.format_sql">true</property>
        <!--自动建表 hibernate.hbm2ddl.auto -->
        <!--
        create-drop : 每次在创建sessionFactory时候执行创建表;当创建sessionFactory的close方法的时候,删除表
        create : 每次都重新建表; 如果表已经存在就先删除再创建
        update : 如果表不存在就创建; 表存在就不创建
        validate : (生产环境时候) 执行验证:当映射文件的内容与数据库表结构不一样的时候就报错
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 3.加载所有映射-->
        <mapping resource="com/flynn/Employee.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>
映射配置
<?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">
<!-- 映射文件:映射一个实体类对象;描述一个对象最终实现可以直接保存对象数据到数据库中 -->
<!--
package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
auto-import: 默认为true, 在写hql的时候自动导入包名
             如果指定为false, 再写hql的时候必须要写上类的全名;
             如: session.createQuery("from com.flynn.Employee").list();
-->
<hibernate-mapping package="com.flynn" auto-import="true">
    <!--
    class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
        name 指定要映射的对象类型
        table 指定对象对应的表;
              如果没有指定表名, 默认与对象名称一样
    -->
    <class name="Employee" table="employee">
        <!--主键,映射-->
        <id name="empId" column="id" type="java.lang.Integer">
            <!--
            主键的生成策略
            api文档hibernate-distribution-3.6.0.Final/documentation/manual/zh-CN/html_single/index.html#mapping-declaration-id

                identity 自增长(mysql,db2)
                native 自增长(会根据底层数据库自增长的方式选择identity或sequence)
                       如果是mysql数据库, 采用的自增长方式是identity
                       如果是oracle数据库, 使用sequence序列的方式实现自增长
                sequence 自增长(序列), oracle中自增长是以序列方法实现
                increment 自增长(会有并发访问的问题, 一般在服务器集群环境使用会存在问题)
            -->
            <generator class="native"/>
        </id>
        <!--
            普通字段的映射
            property
                name 指定对象的属性名称
                column 指定对象属性对应的表的字段名称, 如果不写默认与对象属性一致
                length 指定字符的长度, 默认为255
                type 指定表的字段的类型, 如果不指定会匹配属性的类型
                    java类型: 必须写全名
                    hibernate类型: 直接写类型,都是小写
        -->
        <property name="empName" column="empName" length="20" type="java.lang.String"></property>
        <property name="workDate" column="workDate" type="java.util.Date"></property>
        <!-- 如果列名称为数据库关键字,需要用反引号或改列名 -->
        <property name="desc" column="`desc`" type="java.lang.String"></property>
    </class>
</hibernate-mapping>
复合主键的映射
  • 表对应的User实体类
public class User {

    private CompositeKeys keys;
    private int age;

    public CompositeKeys getKeys(){
        return keys;
    }

    public void setKeys(CompositeKeys keys){
        this.keys = keys;
    }

    public int getAge(){
        return age;
    }

    public void setAge(int age){
        this.age = age;
    }
}
  • 复合主键必须放到一个类里 , 且必须实现Serializable
public class CompositeKeys implements Serializable {

    private String userName;
    private String address;

    public String getUserName(){
        return userName;
    }

    public void setUserName(String userName){
        this.userName = userName;
    }

    public String getAddress(){
        return address;
    }

    public void setAddress(String address){
        this.address = address;
    }
}
  • 复合主键映射配置文件
<?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.flynn" auto-import="true">
    <class name="User">
        <!--复合主键,映射-->
        <composite-id name="keys">
            <key-property name="userName" type="string"></key-property>
            <key-property name="address" type="string"></key-property>
        </composite-id>

        <property name="age" type="int"></property>
    </class>
</hibernate-mapping>
集合映射
  • javaBean
public class WyxUser {

    private int userId;
    private String userName;
    // 一个用户 对应的多个地址
    private Set<String> address;

    private List<String> addressList;

//    private String[] addressArray; // 映射方式与list一样的

    private Map<String, String> addressMap;

    public Map<String, String> getAddressMap(){
        return addressMap;
    }

    public void setAddressMap(Map<String, String> addressMap){
        this.addressMap = addressMap;
    }

    public List<String> getAddressList(){
        return addressList;
    }

    public void setAddressList(List<String> addressList){
        this.addressList = addressList;
    }

    public int getUserId(){
        return userId;
    }

    public void setUserId(int userId){
        this.userId = userId;
    }

    public String getUserName(){
        return userName;
    }

    public void setUserName(String userName){
        this.userName = userName;
    }

    public Set<String> getAddress(){
        return address;
    }

    public void setAddress(Set<String> address){
        this.address = address;
    }
}
  • 映射文件
<?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.flynn" auto-import="true">
    <class name="WyxUser" table="t_user">

        <id name="userId" column="id">
            <generator class="native"/>
        </id>
        <property name="userName"></property>

        <!--
            set集合属性的映射
                name 指定要映射的集合的属性
                table 集合属性要映射到的表
                key 指定集合表(t_address)的外键字段
                element 指定集合表的其他字段
                    type 元素类型,一定要指定
        -->
        <set name="address" table="t_address">
            <key column="uid"></key>
            <element column="address" type="string"></element>
        </set>

        <!--
            list集合映射
                list-index 指定的是排序列的名称(因为要保证list集合的有序)
        -->
        <list name="addressList" table="t_addressList">
            <key column="uid"></key>
            <list-index column="idx"></list-index>
            <element column="address" type="string"></element>
        </list>
        <!--
            map集合的映射
                key 指定外键字段
                map-key 指定map的key
                element 指定map的value
        -->
        <map name="addressMap" table="t_addressMap">
            <key column="uid"></key>
            <map-key type="string" column="shortName"></map-key>
            <element column="address" type="string"></element>
        </map>

    </class>
</hibernate-mapping>
  • 测试代码
    @Test
    public void testSaveWUserSet() throws Exception{
        WyxUser user = new WyxUser();

        user.setUserName("flynn1");
        Set<String> addressSet = new HashSet<>();
        addressSet.add("china1");
        addressSet.add("usa1");
        user.setAddress(addressSet);
        // 创建session
        Session session = sessionFactory.openSession();
        // 提交事务
        Transaction tx = session.beginTransaction();
        // --执行操作--
        session.save(user);
        // 提交事务
        tx.commit();
        // 关闭session
        session.close();
    }

    @Test
    public void testSaveWUserList() throws Exception{
        WyxUser user = new WyxUser();
        user.setUserName("flynn2");
        List<String> addressList = new ArrayList<>();
        addressList.add("china");
        addressList.add("usa");
        user.setAddressList(addressList);
        // 创建session
        Session session = sessionFactory.openSession();
        // 提交事务
        Transaction tx = session.beginTransaction();
        // --执行操作--
        session.save(user);
        // 提交事务
        tx.commit();
        // 关闭session
        session.close();
    }

    @Test
    public void testSaveWUserMap() throws Exception{
        WyxUser user = new WyxUser();
        user.setUserName("flynn2");
        Map<String, String> map = new HashMap<>();
        map.put("A001", "china");
        map.put("A002", "us");
        user.setAddressMap(map);
        // 创建session
        Session session = sessionFactory.openSession();
        // 提交事务
        Transaction tx = session.beginTransaction();
        // --执行操作--
        session.save(user);
        // 提交事务
        tx.commit();
        // 关闭session
        session.close();
    }

    @Test
    public void testGet() throws Exception{
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        // 获取
        WyxUser user = (WyxUser) session.get(WyxUser.class, 3);
        System.out.println(user.getUserId());
        System.out.println(user.getUserName());

        // 当查询用户时, 用户可以获取用户关联的list集合的数据(因为有正确的映射)
        // 当使用到集合数据的使用, 才向数据库发送执行的sql语句(懒加载)
        System.out.println(user.getAddressList());

        session.getTransaction().commit();
        session.close();
    }

相关文章

  • Hibernate映射类型篇

    一、 Java类型 -Hibernate映射关系文件中,配置属性和字段关系时,可以在type属性上指定Java类型...

  • java框架Hibernate的配置和映射属性

    主配置参数详解及复合映射,集合映射 Hibernate.cfg.xml 主配置文件中主要配置:数据库连接信息、其他...

  • Hibernate学习(配置文件详解)

    Hibernate映射配置文件(重点) 映射配置文件名称和位置没有固定要求 映射配置文件中,标签name属性值写实...

  • Hibernate--配置文件详解--API

    一 Hibernate映射配置文件1 映射配置文件名称和位置没有固定要求2 映射配置文件中,标签name属性写实体...

  • Hibernate快速入门

    Hibernate是一个开源,轻量级的ORM(对象关系映射)工具。Hibernate框架简化了java应用程序与数...

  • hibernate的组成

    配置文件hibernate.cfg.xml持久化类 Customer.java映射文件 Cus...

  • Hibernate的学习

    一.HIbernate框架介绍 什么是Hibernate: Hibernate是一个开放源代码的对象关系映射框架,...

  • hibernate-1

    hibernate和ORM概念 hibernate 是对jdbc进行轻量级对象封装的框架,是一种关系型映射框架对象...

  • Hibernate映射文件详解

    类名.hbm.xml 关系映射配置文件 hibernate、java、标准sql数据类型对照表 即映射文件中 标签...

  • Hibernate介绍

    Hibernate的介绍: (开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系映射框架...

网友评论

      本文标题:java框架Hibernate的配置和映射属性

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