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的连接参数,并且 ...
随机推荐
- 如何向AcmeAir注入问题代码
为什么要注入问题代码? AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的.为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在A ...
- E时代主机,其实做一个小虚拟主机还是不错的
http://www.idcen.com/ 做微信没有网上测试地址,找了一下发现以前用过的.记录一下.一个100m的虚拟主机需要三四十块钱,做微信,做一个小型网站还是够用的,就是mysql有点问题,不 ...
- Alpha、 Beta、build、release测试
alpha(内测) alpha测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试.alpha测试的目的是评价软件产品的FLURPS(即功能.局域化.可使用性. ...
- sql 随笔 2015-08-07
xls 导入数据库 --删除现有数据 DELETE FROM dbo.PhoneList --插入数据 insert into dbo.PhoneList --读取xls数据 ) , as [Enab ...
- poj 1325 Machine Schedule 二分匹配,可以用最大流来做
题目大意:机器调度问题,同一个任务可以在A,B两台不同的机器上以不同的模式完成.机器的初始模式是mode_0,但从任何模式改变成另一个模式需要重启机器.求完成所有工作所需最少重启次数. ======= ...
- 关于c#字典key不存在的测试
之前一直隐约记得没有创建key会报异常,测试了下. 测试结果: 写入值,如果不存在key,会自动创建. 取值,如果不存在key,会报异常. 一般用c#提供了尝试取值方法,不过有out参数,考虑写扩展 ...
- centos6.5 中文
之前在网上查了不少资料,很多网友在网上都说,在shell命令下输入: # vi /etc/sysconfig/i18n 然后修改LANG="en_US.UTF-8" ...
- cookie使用
知识拷贝. 理论很简单,而且模式也和大多请求 http://blog.csdn.net/lanmao100/article/details/2328491(源地址).返回状态的SSO差不多.但是有几个 ...
- Support Library(4)ecliplse导入支援包的方法
准备工作 下载支援包到本地.在 <sdk>/android-sdks/extras/android/support/v7 下包含两个目录「 m2repository,support 」 ...
- [HDOJ2546] 饭卡 (01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 先找出最贵的那个菜,这个菜一定是最后买的那个.然后再在前n-1个菜里做01背包.找出不超过m-5 ...