hibernate建表一对多 一的一方控制多的方
级联操作,操作class对象的时候 级联操作 student
Classes.java文件
package cn.itcast.hiberate.sh.domain; import java.util.Set; public class Classes {
private Long cid;
private String cname;
private String description;
public String getDescription() {
return description;
}
public Classes(String cname, String description) {
super();
this.cname = cname;
this.description = description;
}
public Classes(Long cid, String cname, String description,
Set<Student> students) {
super();
this.cid = cid;
this.cname = cname;
this.description = description;
this.students = students;
}
public Classes() {
// TODO Auto-generated constructor stub
}
public void setDescription(String description) {
this.description = description;
}
private Set<Student> students;
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }
Classes.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.Classes">
<id name="cid" length="5" type="java.lang.Long">
<generator class="increment"></generator>
</id>
<property name="cname" length="20" type="java.lang.String"></property> <property name="description" length="100" type="java.lang.String"></property>
<!--
set元素对应类中的set集合
通过set元素使classes表与student表建立关联
key是通过外键的形式让两张表建立关联
one-to-many是通过类的形式让两个类建立关联 cascade 级联
save-update
1、当 保存班级的时候,对学生进行怎么样的操作
如果学生对象在数据库中没有对应的值,这个时候会执行save操作
如果学生对象在数据库中有对应的值,这个时候会执行update操作
delete
all
inverse 维护关系
true 不维护关系
false 维护关系
default false
-->
<set name="students" cascade="save-update" inverse="true">
<!--
key是用来描述外键
-->
<key>
<column name="cid"></column>
</key>
<one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
</set>
</class>
</hibernate-mapping>
Student.java
package cn.itcast.hiberate.sh.domain; public class Student {
private Long sid;
private String sname;
private String description;
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;
} }
Test.java
package cn.itcast.hibernate.sh.test; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.annotations.Type;
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; /**
* 1、新建一个班级
* 2、新建一个学生
* 3、新建一个班级的时候同时新建一个学生
* 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系
* 5、已经存在一个学生,新建一个班级,把学生加入到该班级
* 6、把一个学生从一个班级转移到另一个班级
* 7、解析一个班级和一个学生之间的关系
* 8、解除一个班级和一些学生之间的关系
* 9、解除该班级和所有的学生之间的关系
* 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
* 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
* 12、删除学生
* 13、删除班级
* 删除班级的时候同时删除学生
* 在删除班级之前,解除班级和学生之间的关系
* @author Think
*
*/
public class OneToManySingleTest extends HiberanteUtils{
@Test
public void testSaveClasses(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setCname("传智上海云一期");
classes.setDescription("很牛");
session.save(classes);
transaction.commit();
session.close();
} @Test
public void testSaveStudent(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("班长");
student.setDescription("老牛:很牛");
session.save(student);
transaction.commit();
session.close();
} @Test
public void testSaveClasses_Student(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction(); Classes classes = new Classes();
classes.setCname("传智上海云二期:");
classes.setDescription("很牛X"); Student student = new Student();
student.setSname("班长");
student.setDescription("老牛:很牛X"); session.save(student);
session.save(classes);
transaction.commit();
session.close();
} /**
* 在保存班级的时候,级联保存学生
*/
@Test
public void testSaveClasses_Cascade_Student_Save(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction(); Classes classes = new Classes();
classes.setCname("传智上海云三期:");
classes.setDescription("很牛XX"); Student student = new Student();
student.setSname("班长");
student.setDescription("老牛:很牛XX"); Set<Student> students = new HashSet<Student>();
students.add(student); //建立classes与student之间的关联
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
} @Test
public void testSaveClasses_Cascade_Student_Update(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction(); Classes classes = new Classes();
classes.setCname("传智上海云四期:");
classes.setDescription("很牛XXX"); Student student = (Student)session.get(Student.class, 1L); student.setSname("班秘"); Set<Student> students = new HashSet<Student>();
students.add(student); classes.setStudents(students); session.save(classes);
transaction.commit();
session.close();
} @Test
public void testUpdateClasses_Cascade_Student_Save(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 5L);
Student student = new Student();
student.setSname("班花");
student.setDescription("稀有人物");
classes.getStudents().add(student);
transaction.commit();
session.close();
} @Test
public void testUpdateClasses_Cascade_Student_Update(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 5L);
Set<Student> students = classes.getStudents();//为cid为5的班级的所有的学生
// for(Student student:students){
// student.setDescription("压力山大");
// }
transaction.commit();
session.close();
} /**
* 一个错误的演示
*/
@Test
public void testSaveClasses_Cascade_Student_Save_Error(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction(); Classes classes = new Classes();
classes.setCname("传智上海云六期:");
classes.setDescription("很牛XXXXXX"); Student student = new Student();
student.setSname("班长XXXXXX");
student.setDescription("老牛:很牛XXXXXX"); Set<Student> students = new HashSet<Student>();
students.add(student); //建立classes与student之间的关联
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
} /**
* 已经存在一个班级,新建一个学生,建立学生与班级之间的关系
* 通过更新班级级联保存学生 cascade
* 建立班级和学生之间的关系 inverse
*/
@Test
public void testSaveStudent_R_1(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("技术班长");
student.setDescription("大神");
Classes classes = (Classes)session.get(Classes.class, 1L); classes.getStudents().add(student); transaction.commit();
session.close();
} /**
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select max(sid) from Student
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
更新关系的操作
Hibernate: update Student set cid=? where sid=?
*/
@Test
public void testSaveStudent_R_2(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("技术班长");
student.setDescription("大神");
Classes classes = (Classes)session.get(Classes.class, 1L); session.save(student); classes.getStudents().add(student); transaction.commit();
session.close();
} /**
* 已经存在一个学生,新建一个班级,把学生加入到该班级
*/
@Test
public void testSaveClasses_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction(); Classes classes = new Classes();
classes.setCname("老毕基础加强班");
classes.setDescription("必看,杀手锏"); Student student = (Student)session.get(Student.class, 2L);
Set<Student> students = new HashSet<Student>();
students.add(student);
classes.setStudents(students); session.save(classes);
transaction.commit();
session.close();
} /**
* 把一个学生从一个班级转移到另一个班级
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.description as descript3_1_0_ from Student student0_ where student0_.sid=?
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
Hibernate: update Student set cid=null where cid=? and sid=?
Hibernate: update Student set cid=? where sid=?
*/
@Test
public void testTransformClass(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//Classes classes5 = (Classes)session.get(Classes.class, 5L);
Classes classes6 = (Classes)session.get(Classes.class, 6L);
Student student = (Student)session.get(Student.class, 1L);
//classes5.getStudents().remove(student);
classes6.getStudents().add(student);
transaction.commit();
session.close();
} /**
* 解除一个班级和一些学生之间的关系
*/ @Test
public void testR_Some(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
Set<Student> students = classes.getStudents();
// for(Student student:students){
// if(student.getSid().longValue()==6||student.getSid().longValue()==7){
// students.remove(student);
// }
// }
//set-->list
List<Student> sList = new ArrayList<Student>(students);
for(int i=0;i<sList.size();i++){
if(sList.get(i).getSid().longValue()==6||sList.get(i).getSid().longValue()==7){
sList.remove(sList.get(i));
i--;
}
} students = new HashSet<Student>(sList);
classes.setStudents(students);
/**
* 增强for循环只能修改一次
* 1、用普通的for循环
* 2、新建一个set集合,把原来的set集合要保留的数据存放到新的set集合中
*/
transaction.commit();
session.close();
} /*
* classes.setStudents(null);直接把班级针对student的集合设置为null
*/
@Test
public void testRealseAll(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
// Set<Student> students = classes.getStudents();
// students.clear();
classes.setStudents(null);
transaction.commit();
session.close();
} /**
* 已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
* 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
*/ @Test
public void testDeleteStudent(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student)session.get(Student.class, 8L);
session.delete(student);
transaction.commit();
session.close();
} //这个时候必须保证inverse="false"才能保证能够维持 Classes和Student之间的关系, 如果为inverse="true"并且cascade="save-update"会报错,外键 //约束错误
@Test
public void testDeleteClasses(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 5L);
//classes.setStudents(null); //因为inverse="true"所以,这句话对数据库没作用,没有关联关系了
session.delete(classes);
transaction.commit();
session.close();
}
//这个时候用到了 Classes.hbm.xml中的级联属性 cascade="delete"(用all就包括它们两个属性)inverse="true"也是没有关系的
@Test
public void testDeleteClasses_Cascade(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 5L);
session.delete(classes);
transaction.commit();
session.close();
} }
hibernate建表一对多 一的一方控制多的方的更多相关文章
- hibernate建表 一对多 多的一方控制一的一方
一对多 单向<one-to-many>通过calss操作student 外键在student表中,所以外键由student维护<many-to-one>通过student操作c ...
- 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的一对多关联映射 Hibernate的多对多关联映射 数据库表与表之间的关系:一对多,多对多,一对一 一对多:一个部门对应多个员工,一个员工只能属于一个部门.一个客户对应多个联系人, ...
- (原创)hibernate 一对多建表实例详解 附上各个注释的含义
这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...
- hibernate注解(自动建表如何有表DDL注释) -- Comment用法
import java.io.Serializable; import java.sql.Date; import java.sql.Timestamp; import javax.persisten ...
- Hibernate不能自动建表解决办法
最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...
随机推荐
- http://my.oschina.net/u/2007041/blog/508520
http://my.oschina.net/u/2007041/blog/508520
- Linux下安装mysql-5.6.4 的图文教程
在开始安装前,先说明一下mysql-5.6.4与较低的版本在安装上的区别,从mysql-5.5起,mysql源码安装开始使用cmake了,因此当我们配置安装目录./configure --perfix ...
- HDU 4647 Another Graph Game 思路+贪心
官方题解: 若没有边权,则对点权从大到小排序即可.. 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可. ..因为当两个人分别选择不同的点时,这一权值将互相抵消. #include <cs ...
- Java I/O操作学习笔记
书上写的有点乱,所以就自己总结了一下,主要参考:http://www.cnblogs.com/qianbi/p/3378466.html 1.从文件读出和写入: import java.io.*; i ...
- ConnectionReset
ConnectionReset The connection was reset by the remote peer. http://stackoverflow.com/questions/1434 ...
- Android 用户界面---拖放(Drag and Drop)(二)
拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事 ...
- Python3 学习第十一弹: 模块学习四之sys库
sys模块 提供一些与python解释器关系紧密的变量和函数 1> argv 命令行参数 通过命令行可以向python传输参数 2> exit([arg]) 程序退出,可以返回给命令行一个 ...
- POJ 2236 (简单并查集) Wireless Network
题意: 有n个电脑坏掉了,分别给出他们的坐标 有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通 两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第 ...
- 51nod1201 整数划分
01背包显然超时.然后就是一道神dp了.dp[i][j]表示j个数组成i的方案数.O(nsqrt(n)) #include<cstdio> #include<cstring> ...
- (转载)DataTable使用技巧总结
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.Da ...