一对多 单向
<one-to-many>
通过calss操作student 外键在student表中,所以外键由student维护
<many-to-one>
通过student操作class 外键在student中,所以自动维护student的外键 没有inverse属性

建议用多对一这个方向的操作效率比较高

Student.java

 1 package cn.itcast.hiberate.sh.domain;
 2
 3 public class Student {
 4     private Long sid;
 5     private String sname;
 6     private String description;
 7     Classes classes;
 8
 9     public Classes getClasses() {
10         return classes;
11     }
12     public void setClasses(Classes classes) {
13         this.classes = classes;
14     }
15     public Long getSid() {
16         return sid;
17     }
18     public void setSid(Long sid) {
19         this.sid = sid;
20     }
21     public Student(String sname, String description) {
22         super();
23         this.sname = sname;
24         this.description = description;
25     }
26     public Student() {
27         // TODO Auto-generated constructor stub
28     }
29     public String getSname() {
30         return sname;
31     }
32     public void setSname(String sname) {
33         this.sname = sname;
34     }
35     public String getDescription() {
36         return description;
37     }
38     public void setDescription(String description) {
39         this.description = description;
40     }
41
42 }

Student.hbm.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <class name="cn.itcast.hiberate.sh.domain.Student">
 6         <id name="sid" length="5">
 7             <generator class="increment"></generator>
 8         </id>
 9         <property name="sname" length="20"></property>
10         <property name="description" length="100"></property>
11         <!--
12             多对一
13               column 外键
14          -->
15         <many-to-one name="classes" class="cn.itcast.hiberate.sh.domain.Classes" column="cid" cascade="save-update"></many-to-one>
16     </class>
17 </hibernate-mapping>

test.java语句

 1 package cn.itcast.hibernate.sh.test;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6 import org.hibernate.Session;
 7 import org.hibernate.Transaction;
 8 import org.junit.Test;
 9
10 import cn.itcast.hiberate.sh.domain.Classes;
11 import cn.itcast.hiberate.sh.domain.Student;
12 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
13
14 /**
15  * 3、新建一个班级的时候同时新建一个学生
16  * 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系
17  * 5、已经存在一个学生,新建一个班级,把学生加入到该班级
18  * 6、把一个学生从一个班级转移到另一个班级
19  * 7、解析一个班级和一个学生之间的关系
20  * 8、解除一个班级和一些学生之间的关系
21  * 9、解除该班级和所有的学生之间的关系
22  * 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
23  * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
24  * 12、删除学生
25  * 13、删除班级
26  *     删除班级的时候同时删除学生
27  *     在删除班级之前,解除班级和学生之间的关系
28  * @author Think
29  *
30  */
31 public class OneToManyTest extends HiberanteUtils{
32     @Test
33     public void testSaveStudent_Cascade_Classes_Save(){
34         Session session = sessionFactory.openSession();
35         Transaction transaction = session.beginTransaction();
36         Student student = new Student();
37         student.setSname("班秘");
38         student.setDescription("很神秘的一个工作");
39
40         Classes classes = new Classes();
41         classes.setCname("老毕亲子班");
42         classes.setDescription("都是老毕的亲戚");
43
44         student.setClasses(classes);
45 //        Set<Student> students = new HashSet<Student>();
46 //        students.add(student);
47 //
48 //        classes.setStudents(students);
49         session.save(student);
50
51         transaction.commit();
52         session.close();
53     }
54
55
56     /**
57      * 一对多,从多的一端维护关系效率比较高
58      */
59     @Test
60     public void testSaveStudent_R(){
61         Session session = sessionFactory.openSession();
62         Transaction transaction = session.beginTransaction();
63
64         Student student = new Student();
65         student.setSname("这个人");
66         student.setDescription("很好");
67
68         Classes classes = (Classes)session.get(Classes.class, 2L);
69         student.setClasses(classes);
70
71        //Set<Student> students = new HashSet<Student>();
72        //students.add(student);
73
74         //classes.getStudents().add(student);//在hibernate内部查看的是classes.hbm.xml
75
76         session.save(student);//在hibernate内部查看的是Student.hbm.xml
77         transaction.commit();
78         session.close();
79     }
80
81     @Test
82     public void testRelese_R(){
83         Session session = sessionFactory.openSession();
84         Transaction transaction = session.beginTransaction();
85         Classes classes = (Classes)session.get(Classes.class, 2L);
86         Student student7 = (Student)session.get(Student.class, 7L);
87         Student student8 = (Student)session.get(Student.class, 8L);
88         student7.setClasses(null);
89         student8.setClasses(null);

      //也可以用以下替代

        Classes classes=(Classes) session.get(Classes.class, 9L);
        Set<Student> stu=classes.getStudents();
        for(Student s:stu)
          s.setClasses(null);

90         transaction.commit();
91         session.close();
92     }
93 }

转载于:https://www.cnblogs.com/friends-wf/p/3776134.html

hibernate建表 一对多 多的一方控制一的一方相关推荐

  1. 数据库建表-- 一对多/多对一/一对一/多对多 关系

     转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...

  2. oracle建表代码,Oracle 建表(一对多)代码及相关约束示例

    建表(一对多)代码及相关约束 create table t_class( c_id number(3) primary key, c_name varchar2(20) not null ); cre ...

  3. 【2 - 数据库是如何存储数据的】Sql Server - 郝斌(字段、记录、表;图形化界面及sql语句建表;六种约束;一对一、一对多、多对多、数据库关系图;主外键)

    课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 数据库是如何解决数据存储问题的 1. 表的相关数据 2. create tab ...

  4. Hibernate详细进阶教程(从建表到实现表的操作)

    1.Hibernate主键生成策略 自然主键:把具有业务含义的字段作为主键,称之为自然主键.例如在customer表中,如果把name作为主键,其前提条件必须是:每一个客户的姓名不允许为null,不允 ...

  5. hibernate mysql 自动建表_配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码update upda ...

  6. 配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  7. Springboot 之 Hibernate自动建表(Mysql)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 引入Maven依赖包 <dependency><groupId>org.sp ...

  8. 打包jar文件后的spring部署及hibernate自动建表经验总结

    楔子 用spring+hibernate做一个服务器运行程序,在部署到服务器时(打包成jar,在window server2008下运行),出现了以下两个纠结问题: 1. 加载不了Spring容器 2 ...

  9. Hibernate无法自动建表的缘故

    说一下我的缘故:根本原因是建表的SQL语句错误,不同的版本的hibernate-core包下的不同的Dialect使用的SQL是不一样的,我开启了show-sql后,控制台打印如下: Hibernat ...

最新文章

  1. mysql 4.0.27 下载,CentOS编译Mysql 4.0.27数据库问题解决
  2. Kafka如何对Topic元数据进行细粒度的懒加载、同步等待?
  3. 多线程之:用户态和内核态的区别
  4. 阿里云服务器1M带宽是多少
  5. Spring 的设计初衷
  6. halcon对光源打光不均匀进行平场矫正
  7. P3521-[POI2011]ROT-Tree【线段树合并】
  8. 将华氏温度转化成摄氏度和绝对温度
  9. Java多线程学习三十三:Future 的主要功能是什么?
  10. 14. 税收规则(Tax Rules)
  11. 超级计算器——两个大数相乘
  12. Ubuntu 使用 Cron 实现计划任务
  13. 体外诊断(IVD)行业系列四:快速崛起的独立医学实验室
  14. 知识图谱实体预测任务如何计算filtered MRR
  15. latch mysql_关于MySQL latch争用深入分析与判断
  16. 1024购书狂欢节,优惠券送给有需要的伙伴们
  17. 区块链最可能大规模应用场景:社交网络和共享经济
  18. 数字后端知识点扫盲——Floorplan
  19. win10和Ubuntu18.04双系统开机后不能进入win10界面的问题
  20. 假装自己是“黑客”二

热门文章

  1. MySQL数据库设计总结
  2. Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散列图、雷达图)优雅的舞...
  3. C语言学习笔记(五) 数组
  4. Hadoop入门连接
  5. Validation-jQuery表单验证插件使用方法
  6. 关于软件质量(2)- 开发 vs 测试
  7. PB做的史上最强的矢量图监控软件(什么组态软件与监控软件的核心都源于此原理)...
  8. 语言沟通6c,如何做到轻松有效沟通
  9. spring管理hibernate的SessionFactory-多种配置方法
  10. golang中的strings.TrimPrefix