首先是“一”的

Customer.java

 package com.xiaostudy.domain;

 import java.util.HashSet;
import java.util.Set; /**
* 一对多中的“一”的bean
*
* @author xiaostudy
*
*/
public class Customer {
// id
private Integer id;
// 普通属性
private String name;
// “多”的集合,一般选Set集合,因为Set的特点,里面的元素不能重复
private Set<Order> order = new HashSet<Order>(); // 自动生成get、set方法
public Integer getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Order> getOrder() {
return order;
} public void setOrder(Set<Order> order) {
this.order = order;
}
}

接着就是“多”

Order.java

 package com.xiaostudy.domain;

 /**
* 一对多中的“多”的bean
*
* @author xiaostudy
*
*/
public class Order {
// id
private Integer id;
// 普通属性
private String name;
// 一对多中的“一”
private Customer customer; // 自动生成get、set方法
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
} }

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

Customer.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!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.xiaostudy.domain">
<!-- name为bean的类名,table为数据库的表名 -->
<class name="Customer" table="customer">
<!-- name为bean中的属性id,column为数据库中的列名 -->
<id name="id" column="id">
<!-- generator:主键生成策略
1.increment 数据库自己生成主键. 先从数据库中查询最大的ID值,将ID值加1作为新的主键
2.identity 依赖于数据的主键自增功能
3.sequence 序列,依赖于数据中的序列功能(Oracle).
4.hilo(纯了解,永远用不到) : Hibernate自己实现序列的算法,自己生成主键. (hilo算法 )
5.native 自动根据数据库判断,三选一. identity|sequence|hilo
6.uuid 生成32位的不重复随机字符串当做主键
7.assigned 自己指定主键值. 表的主键是自然主键时使用.
-->
<generator class="native"></generator>
</id>
<!-- property普遍属性,name为bean中的普通属性,column为数据库中的列名,type为数据类型 -->
<property name="name" column="name" type="string"></property>
<!-- set为一对多中“一”的设置,inverse的值表示是否为自身维护关系,默认也是false -->
<set name="order" inverse="true">
<!-- key为“一”对应“多”的键,column为键的名称 -->
<key column="cid"></key>
<!-- one-to-many表明自身是一对多的“一”,class为“多”的类名 -->
<one-to-many class="Order" />
</set>
</class>
</hibernate-mapping>

Order.hbm.xml

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

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>
<!-- 注册驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- mysql的用户名 -->
<property name="connection.username">root</property>
<!-- mysql的用户密码 -->
<property name="connection.password">123456</property>
<!-- 连接mysql的某库 -->
<property name="connection.url">jdbc:mysql://localhost:3306/user</property>
<!-- 控制台输出sql -->
<property name="show_sql">true</property>
<!-- 格式化输出的sql -->
<property name="format_sql">true</property>
<!-- 自动提交事务 -->
<!-- <property name="connection.autocommit">true</property> -->
<!-- 创建sql表
update:如果没有表,则创建一个。如果有表,而且表结构一致,那么不改变表。如果表结构不一样,会添加sql表缺少的列,多余的也不会删除。
create:不管sql表有没有存在,都会重新创建表。
create-drop:在create的基础上,每次关闭虚拟机时都会把表删除了。
validate:效验sql表,如果一致,则没有反应,如果不一致了,会抛出异常。
-->
<property name="hbm2ddl.auto">update</property>
<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
<property name="current_session_context_class">thread</property>
<!-- 数据库方言配置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 导入映射文件 -->
<mapping resource="com/xiaostudy/domain/Customer.hbm.xml"/>
<mapping resource="com/xiaostudy/domain/Order.hbm.xml"/>
</session-factory>
</hibernate-configuration>

HibernateUtils.java

 package com.xiaostudy.util;

 import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session; /**
* Hibernate的工具类
*
* @author xiaostudy
*
*/
public class HibernateUtils {
// 定义一个SessionFactory
private static SessionFactory sessionFactory; // 静态代码块,当类加载时,会只执行一次
static {
// 加载配置文件,这里没有参数,是因为hibernate.cfg.xml文件是默认放在src目录下
Configuration conf = new Configuration().configure();
// 通过配置文件获取一个SessionFactory
sessionFactory = conf.buildSessionFactory();
// 当退出java虚拟机时,自动关闭资源
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
sessionFactory.close();
}
}));
} // 每次都获取新的一个Session
public static Session openSession() {
return sessionFactory.openSession();
} // 获取当前线程的Session,多用于处理事务
public static Session getCurrentSession() {
return sessionFactory.getCurrentSession();
} }

Test1.java

 package com.xiaostudy.test;

 import org.hibernate.classic.Session;

 import com.xiaostudy.domain.Customer;
import com.xiaostudy.domain.Order;
import com.xiaostudy.util.HibernateUtils; /**
* 测试一对多
*
* @author xiaostudy
*
*/
public class Test1 { public static void main(String[] args) {
// 根据工具类获取一个全新的Session
Session session = HibernateUtils.openSession();
// 开始事务
session.beginTransaction();
// 创建“一”的对象
Customer customer = new Customer();
// 赋值
customer.setName("demo1");
// 创建“多”的对象
Order order1 = new Order();
Order order2 = new Order();
// 赋值
order1.setName("test1");
order2.setName("test2");
// 这里是“一”没有维护关系,所以在“多”的设置把“一”添加进来
order1.setCustomer(customer);
order2.setCustomer(customer);
// 数据持久化
session.save(customer);
session.save(order1);
session.save(order2);
// 关闭事务和提交数据
session.getTransaction().commit();
// 关闭资源
session.close();
} }

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


hibernate的一对多配置的更多相关文章

  1. 用户、角色、权限三者多对多用hibernate的一对多注解配置

    用户.角色.权限三者多对多用hibernate的一对多注解配置 //权限表@Table(name = "p")public class P { @Id @GeneratedValu ...

  2. hibernate映射xml文件配置之一对多,多对多

    一对多配置 [1]班级和学生模型 --->班级可容纳多个学生 --->学生只能属于一个班级 [2]一对多配置中的关系维护(inverse) --->一端放弃关系的维护 ---> ...

  3. hibernate 的一对多关联关系映射配置

    hibernate 是操作实体类: 表是一对多的关系,当创建这2个实体的时候 在一的一方定义一个多的一方的集合 在多的一方定义一个一的一方的对象 表是多对多的关系,当创建这2个实体的时候 在互相中都有 ...

  4. hibernate简介以及简单配置

    Hibernate简介: Hibernate是一个开源对象关联关系映射的框架,他对JDBC做了轻量级的封装,使我们可以通过面向对象的思想操作数据库. 为什么要用Hibernate: 1: 对JDBC访 ...

  5. Hibernate,一对多,多对一

    Hibernate环境的配置 hibernate.cfg.xml的配置 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibern ...

  6. hibernate关联关系一对多

    1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性 首先建2个实体类 Order.java package com ...

  7. 测试开发专题:spring-boot如何使用JPA进行双向一对多配置

    本片文章我们主要介绍spring-boot如何进行JPA的配置以及如何进行实体间的一对多配置. 依赖准备 要在spring-boot使用jpa需要在项目中有进入相关的依赖,pom文件里加入下面内容 & ...

  8. hibernate关联关系(一对多)

    什么是关联(association)关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B{ private String name; } pub ...

  9. Hibernate映射一对多双向关联关系及部门关联属性

    一对多双向关联关系:(Dept/Emp的案例) 既可以根据在查找部门时根据部门去找该部门下的所有员工,又能在检索员工时获取某个员工所属的部门. 步骤如下: 1.构建实体类(部门实体类加set员工集合) ...

随机推荐

  1. PowerDesign 使用 用户自定义字段类型 domain 后 生成物理模型图 生成的sql脚本 类型 替换问题

    快捷键 CTRL+G

  2. jquery全景拖动查看效果

    http://sc.chinaz.com/jiaoben/140722166830.htm

  3. python 三行代码实现快速排序

    python 三行代码实现快速排序 最近在看 python cookbook , 里面的例子很精彩,这里就帮过来,做个备忘录 主要利用了行数的递归调用和Python的切片特性,解释一下每行代码的含义: ...

  4. windows7上使用docker容器

    1.安装 下载DockerToolbox,并安装. 下载地址:https://dn-dao-github-irror.daocloud.io/docker/toolbox/releases/downl ...

  5. Python高级教程-Map/Reduce

    Python中的map()和reduce() Python内建了map()和reduce()函数. map() map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每 ...

  6. mysql 建立表之间关系 练习 2

    创建数据库db6 create database db6 charset=utf8; user db6; # 创建班级表 mysql) not null unique); Query OK, rows ...

  7. Android学习十二---在android上实现图像匹配

    一.效果图及功能描述 效果图 点击ShowImg后 点击match,然后点击showmatch,可以不断点击showmatch. 主要功能描述:显示在SD卡上已经存在的图片test.jpg,根据图片在 ...

  8. go——函数

    1.定义 函数是结构化编程的最小单元模式.它将复杂的算法过程分解为若干个较小任务,隐藏相关细节,使程序结构更加清晰,易于维护.函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果 ...

  9. Linux Shell编程第3章——正则表达式

    目录 正则表达式基础 正则表达式的扩展 通配 grep命令 正则表达式基础 Linux Shell以字符串作为表达式向系统传达意思.元字符(Metacharacters)是用来阐述字符表达式意义的字符 ...

  10. PHP范例注册审核

    <body> <h1>注册</h1> <form action="zcchuli.php" method="post" ...