hibernate建表 一对多 多的一方控制一的一方
一对多 单向
<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建表 一对多 多的一方控制一的一方的更多相关文章
- hibernate建表一对多 一的一方控制多的方
级联操作,操作class对象的时候 级联操作 student Classes.java文件 package cn.itcast.hiberate.sh.domain; import java.util ...
- hibernate建表默认为UTF-8编码
一.问题: hibernate自动建表的编码应该是数据默认的编码格式,一般也不是utf-8.所以想要建表默认的编码是UTF-8,应该怎么做呢? 二.解决方法: 拿mysql举例: (一).修改hibe ...
- hibernate 建表一对一 就是一对多,多的一方外键唯一unique
Person.java package cn.itcast.hiberate.sh.domain.onetoone; import java.io.Serializable; import java. ...
- hibernate建表多对多建表
Student.java package cn.itcast.hiberate.sh.domain; import java.util.Set; public class Student { priv ...
- hibernate自动建表采用UTF-8字符编码
hibernate自动建表采用UTF-8字符编码 hibernate建表默认为UTF-8编码 >>>>>>>>>>>>>& ...
- (原创)hibernate 一对多建表实例详解 附上各个注释的含义
这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...
- 非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通过id进行维护与建文件
非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通 ...
- hibernate注解(自动建表如何有表DDL注释) -- Comment用法
import java.io.Serializable; import java.sql.Date; import java.sql.Timestamp; import javax.persisten ...
- Hibernate不能自动建表解决办法
最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...
随机推荐
- Linux Command Line 解析
Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...
- iOS开发--xcode快捷键
1. 文件CMD + N: 新文件CMD + SHIFT + N: 新项目CMD + O: 打开CMD + S: 保存CMD+OPt+S:保存所有文件CMD + SHIFT + S: 另存为CMD + ...
- iOS开发--验证码
第一步,拖两个空间textfiled和button到storyboard上的viewcontroller上. 第二步,拖线,链接到.h文件中代码如下: 1 @property (weak, nonat ...
- Qt之QSpacerItem(控件之间的间距不尽相同,可以借助QSpacerItem来设置,并且还可以对QSpacerItem设置QSizePolicy)
http://blog.csdn.net/u011012932/article/details/51614868
- SQLServer错误代码解释
SQLServer出现错误的代码大全(好用) Code Error Message 0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. ...
- Android 使用剪切板传递数据
使用剪切板传递数据,可以传递简单的数据,也可以传递可序列化的对象. 首先来个简单点吧. 首先在,mainActivity.xml文件中加入一个button按钮 private Button butto ...
- MyBatis实现SaveOrUpdate
这篇文章主要讲如何通过xml方式实现SaveOrUpdate,但是仍然建议在Service中实现. 例子 <insert id="saveOrUpdate" > < ...
- 从SDE库文件手工删除SDE图层(转载)
转载自:http://gis-conquer.blog.sohu.com/164467560.html 一.前言 虽然Catalog能解决这种问题,但是在特殊情况下也许这种方法有点用途. ...
- Makefile简介
1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):in ...
- vmware装redhat该光盘无法被挂载
为了考网工,没办法只能学学linux了,前天在vmware7装redhat 提示该光盘无法被挂载,还以为是光盘错误,换了N个盘,又装了很多次,最后观察到,换了盘之后点确定,里面就提示该光盘无法被挂载, ...