zoukankan      html  css  js  c++  java
  • hibernate的一对多配置

    首先是“一”的

    Customer.java

     1 package com.xiaostudy.domain;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 /**
     7  * 一对多中的“一”的bean
     8  * 
     9  * @author xiaostudy
    10  *
    11  */
    12 public class Customer {
    13     // id
    14     private Integer id;
    15     // 普通属性
    16     private String name;
    17     // “多”的集合,一般选Set集合,因为Set的特点,里面的元素不能重复
    18     private Set<Order> order = new HashSet<Order>();
    19 
    20     // 自动生成get、set方法
    21     public Integer getId() {
    22         return id;
    23     }
    24 
    25     public void setId(int id) {
    26         this.id = id;
    27     }
    28 
    29     public String getName() {
    30         return name;
    31     }
    32 
    33     public void setName(String name) {
    34         this.name = name;
    35     }
    36 
    37     public Set<Order> getOrder() {
    38         return order;
    39     }
    40 
    41     public void setOrder(Set<Order> order) {
    42         this.order = order;
    43     }
    44 }

    接着就是“多”

    Order.java

     1 package com.xiaostudy.domain;
     2 
     3 /**
     4  * 一对多中的“多”的bean
     5  * 
     6  * @author xiaostudy
     7  *
     8  */
     9 public class Order {
    10     // id
    11     private Integer id;
    12     // 普通属性
    13     private String name;
    14     // 一对多中的“一”
    15     private Customer customer;
    16 
    17     // 自动生成get、set方法
    18     public Integer getId() {
    19         return id;
    20     }
    21 
    22     public void setId(Integer id) {
    23         this.id = id;
    24     }
    25 
    26     public String getName() {
    27         return name;
    28     }
    29 
    30     public void setName(String name) {
    31         this.name = name;
    32     }
    33 
    34     public Customer getCustomer() {
    35         return customer;
    36     }
    37 
    38     public void setCustomer(Customer customer) {
    39         this.customer = customer;
    40     }
    41 
    42 }

    接着就是这两个bean对应的映射关系配置文件

    Customer.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5 <!-- 引进包,如果没有引进,下面用到的类要全路径 -->
     6 <hibernate-mapping package="com.xiaostudy.domain">
     7     <!-- name为bean的类名,table为数据库的表名 -->
     8     <class name="Customer" table="customer">
     9         <!-- name为bean中的属性id,column为数据库中的列名 -->
    10         <id name="id" column="id">
    11             <!-- generator:主键生成策略
    12                      1.increment  数据库自己生成主键. 先从数据库中查询最大的ID值,将ID值加1作为新的主键
    13                     2.identity  依赖于数据的主键自增功能
    14                     3.sequence    序列,依赖于数据中的序列功能(Oracle).
    15                     4.hilo(纯了解,永远用不到) : Hibernate自己实现序列的算法,自己生成主键. (hilo算法 )
    16                     5.native 自动根据数据库判断,三选一. identity|sequence|hilo
    17                     6.uuid  生成32位的不重复随机字符串当做主键
    18                     7.assigned 自己指定主键值. 表的主键是自然主键时使用.
    19              -->
    20             <generator class="native"></generator>
    21         </id>
    22         <!-- property普遍属性,name为bean中的普通属性,column为数据库中的列名,type为数据类型 -->
    23         <property name="name" column="name" type="string"></property>
    24         <!-- set为一对多中“一”的设置,inverse的值表示是否为自身维护关系,默认也是false -->
    25         <set name="order" inverse="true">
    26             <!-- key为“一”对应“多”的键,column为键的名称 -->
    27             <key column="cid"></key>
    28             <!-- one-to-many表明自身是一对多的“一”,class为“多”的类名 -->
    29             <one-to-many class="Order" />
    30         </set>
    31     </class>
    32 </hibernate-mapping>

    Order.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5 
     6 <hibernate-mapping package="com.xiaostudy.domain">
     7     <!-- name为一对多中的“多”的类名,table为数据库的表名,
     8     注意:这里不能用order做表名,因为在mysql中,它是一个关键词 -->
     9     <class name="Order" table="t_order">
    10         <!-- name是id的名称,column为数据库中表的列名 -->
    11         <id name="id" column="id">
    12             <!-- generator:主键生成策略
    13                      1.increment  数据库自己生成主键. 先从数据库中查询最大的ID值,将ID值加1作为新的主键
    14                     2.identity  依赖于数据的主键自增功能
    15                     3.sequence    序列,依赖于数据中的序列功能(Oracle).
    16                     4.hilo(纯了解,永远用不到) : Hibernate自己实现序列的算法,自己生成主键. (hilo算法 )
    17                     5.native 自动根据数据库判断,三选一. identity|sequence|hilo
    18                     6.uuid  生成32位的不重复随机字符串当做主键
    19                     7.assigned 自己指定主键值. 表的主键是自然主键时使用.
    20              -->
    21             <generator class="native"></generator>
    22         </id>
    23         <!-- property普遍属性,name为bean中的普通属性,column为数据库中的列名,type为数据类型 -->
    24         <property name="name" column="name" type="string"></property>
    25         <!-- many-to-one表明自身为“多”,name为bean中属性“一”的名称,column为自身的外键id,class为“一”的类名 -->
    26         <many-to-one name="customer" column="cid" class="Customer"></many-to-one>
    27     </class>
    28 </hibernate-mapping>

    hibernate.cfg.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 
     6 <hibernate-configuration>
     7     <session-factory>
     8         <!-- 注册驱动 -->
     9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    10         <!-- mysql的用户名 -->
    11         <property name="connection.username">root</property>
    12         <!-- mysql的用户密码 -->
    13         <property name="connection.password">123456</property>
    14         <!-- 连接mysql的某库 -->
    15         <property name="connection.url">jdbc:mysql://localhost:3306/user</property>
    16         <!-- 控制台输出sql -->
    17         <property name="show_sql">true</property>
    18         <!-- 格式化输出的sql -->
    19         <property name="format_sql">true</property>
    20         <!-- 自动提交事务 -->
    21         <!-- <property name="connection.autocommit">true</property> -->
    22         <!-- 创建sql表
    23             update:如果没有表,则创建一个。如果有表,而且表结构一致,那么不改变表。如果表结构不一样,会添加sql表缺少的列,多余的也不会删除。
    24             create:不管sql表有没有存在,都会重新创建表。
    25             create-drop:在create的基础上,每次关闭虚拟机时都会把表删除了。
    26             validate:效验sql表,如果一致,则没有反应,如果不一致了,会抛出异常。
    27          -->
    28         <property name="hbm2ddl.auto">update</property>
    29         <!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
    30         <property name="current_session_context_class">thread</property>
    31         <!-- 数据库方言配置 -->
    32         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    33         <!-- 导入映射文件 -->
    34         <mapping resource="com/xiaostudy/domain/Customer.hbm.xml"/>
    35         <mapping resource="com/xiaostudy/domain/Order.hbm.xml"/>
    36     </session-factory>
    37 </hibernate-configuration>

    HibernateUtils.java

     1 package com.xiaostudy.util;
     2 
     3 import org.hibernate.SessionFactory;
     4 import org.hibernate.cfg.Configuration;
     5 import org.hibernate.classic.Session;
     6 
     7 /**
     8  * Hibernate的工具类
     9  * 
    10  * @author xiaostudy
    11  *
    12  */
    13 public class HibernateUtils {
    14     // 定义一个SessionFactory
    15     private static SessionFactory sessionFactory;
    16 
    17     // 静态代码块,当类加载时,会只执行一次
    18     static {
    19         // 加载配置文件,这里没有参数,是因为hibernate.cfg.xml文件是默认放在src目录下
    20         Configuration conf = new Configuration().configure();
    21         // 通过配置文件获取一个SessionFactory
    22         sessionFactory = conf.buildSessionFactory();
    23         // 当退出java虚拟机时,自动关闭资源
    24         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    25             @Override
    26             public void run() {
    27                 sessionFactory.close();
    28             }
    29         }));
    30     }
    31 
    32     // 每次都获取新的一个Session
    33     public static Session openSession() {
    34         return sessionFactory.openSession();
    35     }
    36 
    37     // 获取当前线程的Session,多用于处理事务
    38     public static Session getCurrentSession() {
    39         return sessionFactory.getCurrentSession();
    40     }
    41 
    42 }

    Test1.java

     1 package com.xiaostudy.test;
     2 
     3 import org.hibernate.classic.Session;
     4 
     5 import com.xiaostudy.domain.Customer;
     6 import com.xiaostudy.domain.Order;
     7 import com.xiaostudy.util.HibernateUtils;
     8 
     9 /**
    10  * 测试一对多
    11  * 
    12  * @author xiaostudy
    13  *
    14  */
    15 public class Test1 {
    16 
    17     public static void main(String[] args) {
    18         // 根据工具类获取一个全新的Session
    19         Session session = HibernateUtils.openSession();
    20         // 开始事务
    21         session.beginTransaction();
    22         // 创建“一”的对象
    23         Customer customer = new Customer();
    24         // 赋值
    25         customer.setName("demo1");
    26         // 创建“多”的对象
    27         Order order1 = new Order();
    28         Order order2 = new Order();
    29         // 赋值
    30         order1.setName("test1");
    31         order2.setName("test2");
    32         // 这里是“一”没有维护关系,所以在“多”的设置把“一”添加进来
    33         order1.setCustomer(customer);
    34         order2.setCustomer(customer);
    35         // 数据持久化
    36         session.save(customer);
    37         session.save(order1);
    38         session.save(order2);
    39         // 关闭事务和提交数据
    40         session.getTransaction().commit();
    41         // 关闭资源
    42         session.close();
    43     }
    44 
    45 }

    整个项目上传到码云:https://gitee.com/xiaostudy2/hibernate_one_to_many_demo/attach_files


  • 相关阅读:
    八进制转换成十进制(你会明白的,呵呵)
    从键盘读取7个数(150)的整数值,每读一个值打印出该值个数的*号.
    两个字符串的连接程序
    判断一个素数能被几个9整除.
    809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
    一个偶数总能表示为两个素数的和.
    07所能组成的奇数的个数
    asp.net .ashx文件使用Server.MapPath解决方法
    MVC常见问题小总结
    amcharts_2.6.13左上角的广告咱去掉
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/9520280.html
Copyright © 2011-2022 走看看