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

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

Student.java

 package cn.itcast.hiberate.sh.domain;

 public class Student {
private Long sid;
private String sname;
private String description;
Classes classes; public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public Student(String sname, String description) {
super();
this.sname = sname;
this.description = description;
}
public Student() {
// TODO Auto-generated constructor stub
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
} }

Student.hbm.xml

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

test.java语句

 package cn.itcast.hibernate.sh.test;

 import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.itcast.hiberate.sh.domain.Classes;
import cn.itcast.hiberate.sh.domain.Student;
import cn.itcast.hibernate.sh.utils.HiberanteUtils; /**
* 3、新建一个班级的时候同时新建一个学生
* 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系
* 5、已经存在一个学生,新建一个班级,把学生加入到该班级
* 6、把一个学生从一个班级转移到另一个班级
* 7、解析一个班级和一个学生之间的关系
* 8、解除一个班级和一些学生之间的关系
* 9、解除该班级和所有的学生之间的关系
* 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
* 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
* 12、删除学生
* 13、删除班级
* 删除班级的时候同时删除学生
* 在删除班级之前,解除班级和学生之间的关系
* @author Think
*
*/
public class OneToManyTest extends HiberanteUtils{
@Test
public void testSaveStudent_Cascade_Classes_Save(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("班秘");
student.setDescription("很神秘的一个工作"); Classes classes = new Classes();
classes.setCname("老毕亲子班");
classes.setDescription("都是老毕的亲戚"); student.setClasses(classes);
// Set<Student> students = new HashSet<Student>();
// students.add(student);
//
// classes.setStudents(students);
session.save(student); transaction.commit();
session.close();
} /**
* 一对多,从多的一端维护关系效率比较高
*/
@Test
public void testSaveStudent_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction(); Student student = new Student();
student.setSname("这个人");
student.setDescription("很好"); Classes classes = (Classes)session.get(Classes.class, 2L);
student.setClasses(classes); //Set<Student> students = new HashSet<Student>();
//students.add(student); //classes.getStudents().add(student);//在hibernate内部查看的是classes.hbm.xml session.save(student);//在hibernate内部查看的是Student.hbm.xml
transaction.commit();
session.close();
} @Test
public void testRelese_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 2L);
Student student7 = (Student)session.get(Student.class, 7L);
Student student8 = (Student)session.get(Student.class, 8L);
student7.setClasses(null);
student8.setClasses(null);       //也可以用以下替代

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

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

hibernate建表 一对多 多的一方控制一的一方的更多相关文章

  1. hibernate建表一对多 一的一方控制多的方

    级联操作,操作class对象的时候 级联操作 student Classes.java文件 package cn.itcast.hiberate.sh.domain; import java.util ...

  2. hibernate建表默认为UTF-8编码

    一.问题: hibernate自动建表的编码应该是数据默认的编码格式,一般也不是utf-8.所以想要建表默认的编码是UTF-8,应该怎么做呢? 二.解决方法: 拿mysql举例: (一).修改hibe ...

  3. hibernate 建表一对一 就是一对多,多的一方外键唯一unique

    Person.java package cn.itcast.hiberate.sh.domain.onetoone; import java.io.Serializable; import java. ...

  4. hibernate建表多对多建表

    Student.java package cn.itcast.hiberate.sh.domain; import java.util.Set; public class Student { priv ...

  5. hibernate自动建表采用UTF-8字符编码

    hibernate自动建表采用UTF-8字符编码 hibernate建表默认为UTF-8编码 >>>>>>>>>>>>>& ...

  6. (原创)hibernate 一对多建表实例详解 附上各个注释的含义

    这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...

  7. 非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通过id进行维护与建文件

     非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通 ...

  8. hibernate注解(自动建表如何有表DDL注释) -- Comment用法

    import java.io.Serializable; import java.sql.Date; import java.sql.Timestamp; import javax.persisten ...

  9. Hibernate不能自动建表解决办法

    最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...

随机推荐

  1. dreamweaver cs5中提示扩展管理不可用

    下载: Extension Manager CS5.5 for Windows 安装后重启就能用了

  2. C++:构造函数的默认参数知识拓展

    和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值.   例9.3的问题也可以使用包含默认参数的构造函数来处理.   [例9 ...

  3. dwz ie10一直提示数据加载中

    dwz js资源jquery.validate.js 搜索 this.attr('novalidate', 'novalidate'); 在33行左右 用if (typeof (Worker) !== ...

  4. 通过从代码层面分析Linux内核启动来探知操作系统的启动过程

    通过从代码层面分析Linux内核启动来探知操作系统的启动过程 前言说明 本篇为网易云课堂Linux内核分析课程的第三周作业,我将围绕Linux 3.18的内核中的start_kernel到init进程 ...

  5. 如何实现上下左右键盘控制焦点使之落在相邻文本框或下拉框中-Web开发/JavaScript

    我用jquery只实现了文本框的移动(暂时上下移动等同于左右移动) $(function () { var cols = 1;//按一下跳几个控件 var obj = $("input[id ...

  6. YTU 2615: AB编程题--世界杯小组赛

    2615: AB编程题--世界杯小组赛 时间限制: 1 Sec  内存限制: 128 MB 提交: 100  解决: 35 题目描述 注:本题目自由设计,但必须使用类进行代码设计. 世界杯32支参赛队 ...

  7. Sales Order Flow Statuses

    OE_ORDER_LINES_ALL.flow_status_code column values execute the below query to see the values. SELECT ...

  8. jquery来跨域提交表单

    说说用jquery来实现跨域提交表单 在jQuery中,我们使用json数据类型,通过getJSON方法来实现从服务端获取或发送数据,而当要向不同远程服务器端提交或者获取数据时,要采用jsonp数据类 ...

  9. C++ new、delete

    C++中向系统申请堆内存的方法为使用new.new[]操作符,new申请单个对象的内存,new[]申请对象数组的内存.对应的delete.delete[]操作符将new.new[]操作符申请到的内存还 ...

  10. Codeforces Round #272 (Div. 2) C. Dreamoon and Sums (数学 思维)

    题目链接 这个题取模的时候挺坑的!!! 题意:div(x , b) / mod(x , b) = k( 1 <= k <= a).求x的和 分析: 我们知道mod(x % b)的取值范围为 ...