例如:一个用户可以对应多个订单  但一个订单只能对应一个用户

1.创建实体类

2.编写映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bdqn.cn.pojo2" >
<!-- 因为我们在上一行package里配置了包名所以name这里可以直接写实体类名
table对应数据库表名
-->
<class name="Student" table="student">
<!-- id对应的是主键name对应实体类属性名column对应数据库字段名 -->
<id name="stuid" column="stuid">
<!-- 主键生成策略 increment 适用于代理主键 由hibernate自动以递增的方式生成标识符 每次增量为1 -->
<generator class="increment"/>
</id>
<property name="sname" column="sname"/>
<!-- 我们实体类用到了set集合所以这里用set -->
<!-- cascade里面写save-update级联插入就是当这个表插入数据时和他关联的数据也会插入
delete级联删除和save-update同理
delete-orphan为孤儿删除 仅限于一对多 只有一对多时才会出现类似父子关系的存在 才有父子表的存在 认为一方为父方
也就是当一的一方和多的一方解除关系时 实际上就是外键值赋为null 将这总记录删除时就叫孤儿删除
双向维护会产生多余的sql,要想解决这个问题需要双方有一方放弃维护外键,一般都是一的一方放弃 需要在<set>标签里写inverse="true"
-->
<set name="orders" cascade="save-update,delete,delete-orphan" inverse="true">
<!-- 标签<key>用来描述一对多 多一方的外键名-->
<key column="cno"/>
<!-- 标签<one-to-many>设置一对多映射关系 class设置映射关联目标实体类 -->
<one-to-many class="Orders"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bdqn.cn.pojo2">
<class name="Orders" table="orders">
<id name="oid" column="oid">
<generator class="increment"/>
</id>
<property name="addr" column="addr"/>
<!-- 标签<many-to-one>设置多对一映射关系 cloumn对应的外键名称
cascade在student映射文件已经解释
-->
<many-to-one name="stu" column="cno" class="Student" cascade="save-update"/>
</class>
</hibernate-mapping>

3.编写工具类

4.编写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">
jdbc:mysql://localhost:3306/dsds
</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.username">root</property>
<property name="connection.password">123.com</property>
<property name="dialect">
org.hibernate.dialect.MySQLInnoDBDialect
</property>
<!-- 在控制台显不显示sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定hbm.xml就是映射文件 -->
<mapping resource="com/bdqn/cn/pojo2/Orders.hbm.xml" />
<mapping resource="com/bdqn/cn/pojo2/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>

5.测试类

public class testDemo {
//孤儿删除
@Test
public void test3() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
Student stu1 = (Student) session.get(Student.class, 1);
Orders ord1 = (Orders) session.get(Orders.class, 1);
//删除客户与订单的关系也就是外键值为null 删除没有客户的订单就叫做孤儿删除
stu1.getOrders().remove(ord1);
tx.commit();
session.close();
} //级联删除
@Test
public void test2() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
/*如果运行时出现Java . lang . stackoverflower error这个错误
把toString里另一方的属性值删掉就可以了*/
Student stu1 = (Student) session.get(Student.class, 1);
System.out.println(stu1);
session.delete(stu1);
tx.commit();
session.close();
}
//级联添加
@Test
public void test1() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
Student student=new Student();
student.setSname("张三");
//建立两个订单
Orders order1=new Orders();
order1.setAddr("北京");
Orders order2=new Orders();
order2.setAddr("天津");
//建立关系说明订单1和2属于student
order1.setStu(student);
order2.setStu(student);
student.getOrders().add(order1);
student.getOrders().add(order2);
/**
* 当设置了cascade="save-update"属性时添加用户时就会把对应的订单添加进去
*/
session.save(student);
tx.commit();
session.close();
} }

最新文章

  1. 驱动编程:NtReadVirtualMemory
  2. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
  3. 【转】深入理解 Java 垃圾回收机制
  4. .gitignore详解
  5. Unity学习疑问记录之触屏
  6. Material Design风格的水波涟漪效果(Ripple Effect)的实现
  7. iOS-APP发布应注意要点
  8. [转载]angularjs学习总结 详细教程
  9. javaSE基础之记事本编程
  10. GPIO的8种工作模式
  11. HDU-1238 Substrings
  12. 重新温习,不但可以让自己对js更加的深刻认识,又能加深记忆,至此每天一次复习记录在此。
  13. 高效算法——G - 贪心
  14. WPF控件---Border应用
  15. NodeJs简单七行爬虫--爬取自己Qzone的说说并存入数据库
  16. [Swust OJ 772]--Friend(并查集+map的运用)
  17. Android的BUG(四) - Android app的卡死问题
  18. java流和文件 保存字节级数据(写)
  19. 基于nodejs 的多页面爬虫
  20. 关于awk的多文件处理

热门文章

  1. phpStrom安装PHP_CodeSniffer检查代码规范
  2. QQbug--QQ截图不显示保存类型
  3. python基础实现简单的shell sed 替换功能
  4. 你还记得2017年火爆的VR街机店,这一年他们过得还好吗?
  5. Python---10小结
  6. Linux 下的/usr/bin /usr/sbin /usr/local/bin /usr/local/sbin区别
  7. Book. Effective C++ item2-尽量使用const, enum, inline替换#define
  8. JQUERY的基本使用方法
  9. 微软发布Microsoft Concept Graph和Microsoft Concept Tagging模型
  10. Nginx之常用基本配置(二)