목차
ORM概念
Hibernate 案例
Hibernate Api
Hibernate crud
Hibernate.cfg.xml 主配置
数据库连接参数配置
自动建表
映射配置
复合主键映射

Hibernate框架基础

Jun 07, 2016 pm 02:50 PM
hibernate object orm 베이스 액자 개념

ORM概念 O, Object 对象R, Realtion 关系 (关系型数据库: MySQL, Oracle…)M,Mapping 映射ORM, 对象关系映射!ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象?想做到上面2点,必须要有映射!总结:

ORM概念

<code>O,  Object  对象
R, Realtion 关系  (关系型数据库: MySQL, Oracle…)
M,Mapping  映射

ORM, 对象关系映射!

ORM, 解决什么问题?
    存储:   能否把对象的数据直接保存到数据库? 
获取:  能否直接从数据库拿到一个对象?
想做到上面2点,必须要有映射!


总结:
    Hibernate与ORM的关系?
       Hibernate是ORM的实现!
</code>
로그인 후 복사

Hibernate 案例

<code>搭建一个Hibernate环境,开发步骤:
1. 下载源码
        版本:hibernate-distribution-3.6.0.Final
2. 引入jar文件
        hibernate3.jar核心  +  required 必须引入的(6个) +  jpa 目录  + 数据库驱动包
3. 写对象以及对象的映射
        Employee.java            对象
        Employee.hbm.xml         对象的映射 (映射文件)
4. src/hibernate.cfg.xml  主配置文件
         数据库连接配置
         加载所用的映射(*.hbm.xml)
5. App.java  测试
</code>
로그인 후 복사

对象      Employee.java

<code class=" hljs cs"><span class="hljs-comment">//一、 对象</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Employee {

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> empId;
    <span class="hljs-keyword">private</span> String empName;
    <span class="hljs-keyword">private</span> Date workDate;

}
</code>
로그인 후 복사

对象的映射 Employee.hbm.xml

<code class=" hljs xml"><span class="hljs-pi"><?xml version="1.0"?></span>
<span class="hljs-doctype"><!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"></span>

<span class="hljs-tag"><<span class="hljs-title">hibernate-mapping</span> <span class="hljs-attribute">package</span>=<span class="hljs-value">"cn.itcast.a_hello"</span>></span>

    <span class="hljs-tag"><<span class="hljs-title">class</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"Employee"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"employee"</span>></span>

        <span class="hljs-comment"><!-- 主键 ,映射--></span>
        <span class="hljs-tag"><<span class="hljs-title">id</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"empId"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"id"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">generator</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"native"</span>/></span>
        <span class="hljs-tag"></<span class="hljs-title">id</span>></span>

        <span class="hljs-comment"><!-- 非主键,映射 --></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"empName"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"empName"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"workDate"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"workDate"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>

    <span class="hljs-tag"></<span class="hljs-title">class</span>></span>

<span class="hljs-tag"></<span class="hljs-title">hibernate-mapping</span>></span>
</code>
로그인 후 복사

主配置文件 hibernate.cfg.xml

<code class=" hljs xml"><span class="hljs-doctype"><!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"></span>

<span class="hljs-tag"><<span class="hljs-title">hibernate-configuration</span>></span>
    <span class="hljs-tag"><<span class="hljs-title">session-factory</span>></span>
        <span class="hljs-comment"><!-- 数据库连接配置 --></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hibernate.connection.driver_class"</span>></span>com.mysql.jdbc.Driver<span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hibernate.connection.url"</span>></span>jdbc:mysql:///hib_demo<span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hibernate.connection.username"</span>></span>root<span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hibernate.connection.password"</span>></span>root<span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hibernate.dialect"</span>></span>org.hibernate.dialect.MySQL5Dialect<span class="hljs-tag"></<span class="hljs-title">property</span>></span>

        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hibernate.show_sql"</span>></span>true<span class="hljs-tag"></<span class="hljs-title">property</span>></span>

        <span class="hljs-comment"><!-- 加载所有映射 --></span>
        <span class="hljs-tag"><<span class="hljs-title">mapping</span> <span class="hljs-attribute">resource</span>=<span class="hljs-value">"cn/itcast/a_hello/Employee.hbm.xml"</span>/></span>
    <span class="hljs-tag"></<span class="hljs-title">session-factory</span>></span>
<span class="hljs-tag"></<span class="hljs-title">hibernate-configuration</span>></span>
</code>
로그인 후 복사

测试类 App.java

<code class=" hljs java">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">App</span> {</span>

    <span class="hljs-annotation">@Test</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testHello</span>() <span class="hljs-keyword">throws</span> Exception {
        <span class="hljs-comment">// 对象</span>
        Employee emp = <span class="hljs-keyword">new</span> Employee();
        emp.setEmpName(<span class="hljs-string">"班长"</span>);
        emp.setWorkDate(<span class="hljs-keyword">new</span> Date());

        <span class="hljs-comment">// 获取加载配置文件的管理类对象</span>
        Configuration config = <span class="hljs-keyword">new</span> Configuration();
        config.configure();  <span class="hljs-comment">// 默认加载src/hibenrate.cfg.xml文件</span>
        <span class="hljs-comment">// 创建session的工厂对象</span>
        SessionFactory sf = config.buildSessionFactory();
        <span class="hljs-comment">// 创建session (代表一个会话,与数据库连接的会话)</span>
        Session session = sf.openSession();
        <span class="hljs-comment">// 开启事务</span>
        Transaction tx = session.beginTransaction();
        <span class="hljs-comment">//保存-数据库</span>
        session.save(emp);
        <span class="hljs-comment">// 提交事务</span>
        tx.commit();
        <span class="hljs-comment">// 关闭</span>
        session.close();
        sf.close();
    }
}
</code>
로그인 후 복사

Hibernate Api

<code>|-- Configuration       配置管理类对象
    config.configure();    加载主配置文件的方法(hibernate.cfg.xml)
                           默认加载src/hibernate.cfg.xml
    config.configure(“cn/config/hibernate.cfg.xml”);   
                           加载指定路径下指定名称的主配置文件
    config.buildSessionFactory();   创建session的工厂对象

|-- SessionFactory    session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
    sf.openSession();        创建一个sesison对象
    sf.getCurrentSession();  创建session或取出session对象

|--Session       session对象维护了一个连接(Connection), 代表了与数据库连接的会话。
               Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象
        session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

    更新:
        session.save(obj);   保存一个对象
        session.update(emp);  更新一个对象
        session.saveOrUpdate(emp);  保存或者更新的方法:
                                    没有设置主键,执行保存;
        有设置主键,执行更新操作; 
        如果设置主键不存在报错!

    主键查询:
        session.get(Employee.class, 1);    主键查询
        session.load(Employee.class, 1);   主键查询 (支持懒加载)

    HQL查询:
        HQL查询与SQL查询区别:
            SQL: (结构化查询语句)查询的是表以及字段;  不区分大小写。
            HQL: hibernate  query  language 即hibernate提供的面向对象的查询语言
                查询的是对象以及对象的属性。
                区分大小写。

    Criteria查询:
         完全面向对象的查询。

    本地SQL查询:
        复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!
        (缺点: 不能跨数据库平台!)

|-- Transaction    hibernate事务对象


共性问题1:
ClassNotFoundException…., 缺少jar文件!
共性问题2:
    如果程序执行程序,hibernate也有生成sql语句,但数据没有结果影响。
    问题一般是事务忘记提交…….
遇到问题,一定看错误提示!
</code>
로그인 후 복사

Hibernate crud

<code class=" hljs java">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmployeeDaoImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">IEmployeeDao</span>{</span>

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> Employee <span class="hljs-title">findById</span>(Serializable id) {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            <span class="hljs-comment">// 获取Session</span>
            session = HibernateUtils.getSession();
            <span class="hljs-comment">// 开启事务</span>
            tx = session.beginTransaction();
            <span class="hljs-comment">// 主键查询</span>
            <span class="hljs-keyword">return</span> (Employee) session.get(Employee.class, id);
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> List<Employee> <span class="hljs-title">getAll</span>() {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            <span class="hljs-comment">// HQL查询</span>
            Query q = session.createQuery(<span class="hljs-string">"from Employee"</span>);
            <span class="hljs-keyword">return</span> q.list();
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> List<Employee> <span class="hljs-title">getAll</span>(String employeeName) {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            Query q =session.createQuery(<span class="hljs-string">"from Employee where empName=?"</span>);
            <span class="hljs-comment">// 注意:参数索引从0开始</span>
            q.setParameter(<span class="hljs-number">0</span>, employeeName);
            <span class="hljs-comment">// 执行查询</span>
            <span class="hljs-keyword">return</span> q.list();
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> List<Employee> <span class="hljs-title">getAll</span>(<span class="hljs-keyword">int</span> index, <span class="hljs-keyword">int</span> count) {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            Query q = session.createQuery(<span class="hljs-string">"from Employee"</span>);
            <span class="hljs-comment">// 设置分页参数</span>
            q.setFirstResult(index);  <span class="hljs-comment">// 查询的其实行 </span>
            q.setMaxResults(count);   <span class="hljs-comment">// 查询返回的行数</span>

            List<Employee> list = q.list();
            <span class="hljs-keyword">return</span> list;
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">save</span>(Employee emp) {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            <span class="hljs-comment">// 执行保存操作</span>
            session.save(emp);
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }

    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">update</span>(Employee emp) {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            session.update(emp);

        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }

    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">delete</span>(Serializable id) {
        Session session = <span class="hljs-keyword">null</span>;
        Transaction tx = <span class="hljs-keyword">null</span>;
        <span class="hljs-keyword">try</span> {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            <span class="hljs-comment">// 先根据id查询对象,再判断删除</span>
            Object obj = session.get(Employee.class, id);
            <span class="hljs-keyword">if</span> (obj != <span class="hljs-keyword">null</span>) {
                session.delete(obj);
            }
        } <span class="hljs-keyword">catch</span> (Exception e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
        } <span class="hljs-keyword">finally</span> {
            tx.commit();
            session.close();
        }
    }
}</code>
로그인 후 복사

Hibernate.cfg.xml 主配置

<code>Hibernate.cfg.xml
    主配置文件中主要配置:数据库连接信息、其他参数、映射信息!

常用配置查看源码:
    hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
</code>
로그인 후 복사

数据库连接参数配置

<code>例如:
## MySQL

#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
</code>
로그인 후 복사

自动建表

Hibernate.properties

<code>#hibernate.hbm2ddl.auto create-drop 每次在创建sessionFactory时候执行创建表;
                                当调用sesisonFactory的close方法的时候,删除表!
#hibernate.hbm2ddl.auto create   每次都重新建表; 如果表已经存在就先删除再创建
#hibernate.hbm2ddl.auto update  如果表不存在就创建; 表存在就不创建;
#hibernate.hbm2ddl.auto validate  (生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!
</code>
로그인 후 복사

代码自动建表

<code class=" hljs java">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">App_ddl</span> {</span>

    <span class="hljs-comment">// 自动建表</span>
    <span class="hljs-annotation">@Test</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testCreate</span>() <span class="hljs-keyword">throws</span> Exception {
        <span class="hljs-comment">// 创建配置管理类对象</span>
        Configuration config = <span class="hljs-keyword">new</span> Configuration();
        <span class="hljs-comment">// 加载主配置文件</span>
        config.configure();

        <span class="hljs-comment">// 创建工具类对象</span>
        SchemaExport export = <span class="hljs-keyword">new</span> SchemaExport(config);
        <span class="hljs-comment">// 建表</span>
        <span class="hljs-comment">// 第一个参数: 是否在控制台打印建表语句</span>
        <span class="hljs-comment">// 第二个参数: 是否执行脚本</span>
        export.create(<span class="hljs-keyword">true</span>, <span class="hljs-keyword">true</span>);
    }
}
</code>
로그인 후 복사

映射配置

<code>1. 普通字段类型
2. 主键映射
    单列主键映射
    多列作为主键映射

主键生成策略,查看api:   5.1.2.2.1. Various additional generators


数据库:
    一个表能否有多个主键?   不能。
    为什么要设置主键?       数据库存储的数据都是有效的,必须保持唯一。

    (为什么把id作为主键?)
        因为表中通常找不到合适的列作为唯一列即主键,所以为了方法用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键!

    联合/复合主键
    如果找不到合适的列作为主键,出来用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。
</code>
로그인 후 복사

映射配置

<code class=" hljs xml"><span class="hljs-pi"><?xml version="1.0"?></span>
<span class="hljs-doctype"><!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"></span>


<span class="hljs-comment"><!-- 映射文件: 映射一个实体类对象;  描述一个对象最终实现可以直接保存对象数据到数据库中。  --></span>
<span class="hljs-comment"><!-- 
    package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
    auto-import 默认为true, 在写hql的时候自动导入包名
                如果指定为false, 再写hql的时候必须要写上类的全名;
                  如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
 --></span>
<span class="hljs-tag"><<span class="hljs-title">hibernate-mapping</span> <span class="hljs-attribute">package</span>=<span class="hljs-value">"cn.itcast.c_hbm_config"</span> <span class="hljs-attribute">auto-import</span>=<span class="hljs-value">"true"</span>></span>

    <span class="hljs-comment"><!-- 
        class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
            name 指定要映射的对象的类型
            table 指定对象对应的表;
                  如果没有指定表名,默认与对象名称一样 
     --></span>
    <span class="hljs-tag"><<span class="hljs-title">class</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"Employee"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"employee"</span>></span>

        <span class="hljs-comment"><!-- 主键 ,映射--></span>
        <span class="hljs-tag"><<span class="hljs-title">id</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"empId"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"id"</span>></span>
            <span class="hljs-comment"><!-- 
                主键的生成策略
                    identity  自增长(mysql,db2)
                    sequence  自增长(序列), oracle中自增长是以序列方法实现
                    native  自增长【会根据底层数据库自增长的方式选择identity或sequence】
                            如果是mysql数据库, 采用的自增长方式是identity
                            如果是oracle数据库, 使用sequence序列的方式实现自增长

                    increment  自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)

                    assigned  指定主键生成策略为手动指定主键的值
                    uuid      指定uuid随机生成的唯一的值
                    foreign   (外键的方式, one-to-one讲)
             --></span>
            <span class="hljs-tag"><<span class="hljs-title">generator</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"uuid"</span>/></span>
        <span class="hljs-tag"></<span class="hljs-title">id</span>></span>

        <span class="hljs-comment"><!-- 
            普通字段映射
            property
                name  指定对象的属性名称
                column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。
                length 指定字符的长度, 默认为255
                type   指定映射表的字段的类型,如果不指定会匹配属性的类型
                    java类型:     必须写全名
                    hibernate类型:  直接写类型,都是小写
        --></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"empName"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"empName"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.String"</span> <span class="hljs-attribute">length</span>=<span class="hljs-value">"20"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"workDate"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.util.Date"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-comment"><!-- 如果列名称为数据库关键字,需要用反引号或改列名。 --></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"desc"</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"`desc`"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.String"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>

    <span class="hljs-tag"></<span class="hljs-title">class</span>></span>


<span class="hljs-tag"></<span class="hljs-title">hibernate-mapping</span>></span>

</code>
로그인 후 복사

复合主键映射

对象与主键

<code class=" hljs java"><span class="hljs-comment">// 复合主键类</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CompositeKeys</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Serializable</span>{</span>
    <span class="hljs-keyword">private</span> String userName;
    <span class="hljs-keyword">private</span> String address;
   <span class="hljs-comment">// .. get/set</span>
}</code>
로그인 후 복사
<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User {
    <span class="hljs-comment">// 名字跟地址,不会重复</span>
    <span class="hljs-keyword">private</span> CompositeKeys keys;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
}</code>
로그인 후 복사

User.hbm.xml

<code class=" hljs xml"><span class="hljs-pi"><?xml version="1.0"?></span>
<span class="hljs-doctype"><!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"></span>

<span class="hljs-tag"><<span class="hljs-title">hibernate-mapping</span> <span class="hljs-attribute">package</span>=<span class="hljs-value">"cn.itcast.d_compositeKey"</span> <span class="hljs-attribute">auto-import</span>=<span class="hljs-value">"true"</span>></span>

    <span class="hljs-tag"><<span class="hljs-title">class</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"User"</span>></span>

        <span class="hljs-comment"><!-- 复合主键映射 --></span>
        <span class="hljs-tag"><<span class="hljs-title">composite-id</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"keys"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">key-property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"userName"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"string"</span>></span><span class="hljs-tag"></<span class="hljs-title">key-property</span>></span>

            <span class="hljs-tag"><<span class="hljs-title">key-property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"address"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"string"</span>></span><span class="hljs-tag"></<span class="hljs-title">key-property</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">composite-id</span>></span>

        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"age"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"int"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>     

    <span class="hljs-tag"></<span class="hljs-title">class</span>></span>
<span class="hljs-tag"></<span class="hljs-title">hibernate-mapping</span>></span></code>
로그인 후 복사

APP.java

<code class=" hljs cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> App2 {

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> SessionFactory sf;
    <span class="hljs-keyword">static</span>  {       
        <span class="hljs-comment">// 创建sf对象</span>
        sf = <span class="hljs-keyword">new</span> Configuration()
            .configure()
            .addClass(User.class)  <span class="hljs-comment">//(测试) 会自动加载映射文件:Employee.hbm.xml</span>
            .buildSessionFactory();
    }

    <span class="hljs-comment">//1. 保存对象</span>
    @Test
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testSave</span>() throws Exception {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();

        <span class="hljs-comment">// 对象</span>
        CompositeKeys keys = <span class="hljs-keyword">new</span> CompositeKeys();
        keys.setAddress(<span class="hljs-string">"广州棠东"</span>);
        keys.setUserName(<span class="hljs-string">"Jack"</span>);
        User user = <span class="hljs-keyword">new</span> User();
        user.setAge(<span class="hljs-number">20</span>);
        user.setKeys(keys);

        <span class="hljs-comment">// 保存</span>
        session.save(user);


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

    @Test
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testGet</span>() throws Exception {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();

        <span class="hljs-comment">//构建主键再查询</span>
        CompositeKeys keys = <span class="hljs-keyword">new</span> CompositeKeys();
        keys.setAddress(<span class="hljs-string">"广州棠东"</span>);
        keys.setUserName(<span class="hljs-string">"Jack"</span>);

        <span class="hljs-comment">// 主键查询</span>
        User user = (User) session.<span class="hljs-keyword">get</span>(User.class, keys);
        <span class="hljs-comment">// 测试输出</span>
        <span class="hljs-keyword">if</span> (user != <span class="hljs-keyword">null</span>){
            System.<span class="hljs-keyword">out</span>.println(user.getKeys().getUserName());
            System.<span class="hljs-keyword">out</span>.println(user.getKeys().getAddress());
            System.<span class="hljs-keyword">out</span>.println(user.getAge());
        }


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

</code>
로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 프레임워크에 대한 상용 지원의 비용 효율성을 평가하는 방법 Java 프레임워크에 대한 상용 지원의 비용 효율성을 평가하는 방법 Jun 05, 2024 pm 05:25 PM

Java 프레임워크에 대한 상용 지원의 비용/성능 평가에는 다음 단계가 포함됩니다. 필요한 보증 수준과 SLA(서비스 수준 계약) 보장을 결정합니다. 연구지원팀의 경험과 전문성. 업그레이드, 문제 해결, 성능 최적화와 같은 추가 서비스를 고려하십시오. 위험 완화 및 효율성 향상을 기준으로 비즈니스 지원 비용을 평가합니다.

PHP 프레임워크의 학습 곡선은 다른 언어 프레임워크와 어떻게 비교됩니까? PHP 프레임워크의 학습 곡선은 다른 언어 프레임워크와 어떻게 비교됩니까? Jun 06, 2024 pm 12:41 PM

PHP 프레임워크의 학습 곡선은 언어 숙련도, 프레임워크 복잡성, 문서 품질 및 커뮤니티 지원에 따라 달라집니다. PHP 프레임워크의 학습 곡선은 Python 프레임워크에 비해 높고 Ruby 프레임워크에 비해 낮습니다. Java 프레임워크에 비해 PHP 프레임워크는 학습 곡선이 적당하지만 시작하는 데 걸리는 시간이 더 짧습니다.

PHP 프레임워크의 경량 옵션은 애플리케이션 성능에 어떤 영향을 줍니까? PHP 프레임워크의 경량 옵션은 애플리케이션 성능에 어떤 영향을 줍니까? Jun 06, 2024 am 10:53 AM

경량 PHP 프레임워크는 작은 크기와 낮은 리소스 소비를 통해 애플리케이션 성능을 향상시킵니다. 그 특징은 다음과 같습니다: 작은 크기, 빠른 시작, 낮은 메모리 사용량, 향상된 응답 속도 및 처리량, 리소스 소비 감소 실제 사례: SlimFramework는 500KB에 불과한 REST API를 생성하며 높은 응답성과 높은 처리량을 제공합니다.

Java 프레임워크의 성능 비교 Java 프레임워크의 성능 비교 Jun 04, 2024 pm 03:56 PM

벤치마크에 따르면 소규모 고성능 애플리케이션의 경우 Quarkus(빠른 시작, 낮은 메모리) 또는 Micronaut(TechEmpower 우수)가 이상적인 선택입니다. SpringBoot는 대규모 풀 스택 애플리케이션에 적합하지만 시작 시간과 메모리 사용량이 약간 느립니다.

Golang 프레임워크 문서화 모범 사례 Golang 프레임워크 문서화 모범 사례 Jun 04, 2024 pm 05:00 PM

Golang 프레임워크에서는 명확하고 포괄적인 문서를 작성하는 것이 중요합니다. 모범 사례에는 Google의 Go 코딩 스타일 가이드와 같은 확립된 문서 스타일을 따르는 것이 포함됩니다. 제목, 부제, 목록 등 명확한 조직 구조를 사용하고 탐색 기능을 제공하세요. 시작 안내서, API 참조 및 개념을 포함하여 포괄적이고 정확한 정보를 제공합니다. 코드 예제를 사용하여 개념과 사용법을 설명합니다. 문서를 계속 업데이트하고, 변경 사항을 추적하고, 새로운 기능을 문서화하세요. GitHub 문제 및 포럼과 같은 지원 및 커뮤니티 리소스를 제공합니다. API 문서와 같은 실용적인 예제를 만듭니다.

다양한 애플리케이션 시나리오에 가장 적합한 golang 프레임워크를 선택하는 방법 다양한 애플리케이션 시나리오에 가장 적합한 golang 프레임워크를 선택하는 방법 Jun 05, 2024 pm 04:05 PM

애플리케이션 시나리오를 기반으로 최고의 Go 프레임워크를 선택하세요. 애플리케이션 유형, 언어 기능, 성능 요구 사항 및 생태계를 고려하세요. Common Go 프레임워크: Gin(웹 애플리케이션), Echo(웹 서비스), Fiber(높은 처리량), gorm(ORM), fasthttp(속도). 실제 사례: REST API(Fiber) 구축 및 데이터베이스(gorm)와 상호 작용. 프레임워크를 선택하세요. 주요 성능을 ​​위해서는 fasthttp를 선택하고, 유연한 웹 애플리케이션을 위해서는 Gin/Echo를, 데이터베이스 상호작용을 위해서는 gorm을 선택하세요.

golang 프레임워크 개발에 대한 자세한 실제 설명: 질문과 답변 golang 프레임워크 개발에 대한 자세한 실제 설명: 질문과 답변 Jun 06, 2024 am 10:57 AM

Go 프레임워크 개발에서 일반적인 과제와 해결 방법은 다음과 같습니다. 오류 처리: 관리에는 오류 패키지를 사용하고 중앙에서 오류를 처리하려면 미들웨어를 사용합니다. 인증 및 권한 부여: 타사 라이브러리를 통합하고 사용자 정의 미들웨어를 생성하여 자격 증명을 확인합니다. 동시 처리: 고루틴, 뮤텍스 및 채널을 사용하여 리소스 액세스를 제어합니다. 단위 테스트: 격리를 위해 getest 패키지, 모의 및 스텁을 사용하고, 충분성을 보장하기 위한 코드 적용 도구를 사용합니다. 배포 및 모니터링: Docker 컨테이너를 사용하여 배포를 패키징하고, 데이터 백업을 설정하고, 로깅 및 모니터링 도구를 사용하여 성능과 오류를 추적합니다.

Golang 프레임워크 학습 과정에서 흔히 저지르는 오해는 무엇입니까? Golang 프레임워크 학습 과정에서 흔히 저지르는 오해는 무엇입니까? Jun 05, 2024 pm 09:59 PM

Go 프레임워크 학습에는 다섯 가지 오해가 있습니다. 프레임워크에 대한 과도한 의존과 제한된 유연성입니다. 프레임워크 규칙을 따르지 않으면 코드를 유지 관리하기가 어려워집니다. 오래된 라이브러리를 사용하면 보안 및 호환성 문제가 발생할 수 있습니다. 패키지를 과도하게 사용하면 코드 구조가 난독화됩니다. 오류 처리를 무시하면 예기치 않은 동작과 충돌이 발생합니다.

See all articles