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

一对多 单向
<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 }

hibernate建表 一对多 多的一方控制一的一方,布布扣,bubuko.com

时间: 2024-10-12 07:17:42

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

hibernate建表一对多

级联操作,操作class对象的时候 级联操作 student Classes.java文件 1 package cn.itcast.hiberate.sh.domain; 2 3 import java.util.Set; 4 5 public class Classes { 6 private Long cid; 7 private String cname; 8 private String description; 9 public String getDescription() { 10

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

Person.java 1 package cn.itcast.hiberate.sh.domain.onetoone; 2 3 import java.io.Serializable; 4 import java.util.Set; 5 6 public class Person implements Serializable{ 7 private Long cid; 8 private String cname; 9 private String description; 10 11 pub

hibernate建表多对多建表

Student.java 1 package cn.itcast.hiberate.sh.domain; 2 3 import java.util.Set; 4 5 public class Student { 6 private Long sid; 7 private String sname; 8 private String description; 9 Set<Course> courses; 10 11 12 public Set<Course> getCourses()

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

这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的name属性=多的那一端(N端)属性是一的那一端的属性名,mappedBy是定义在Department类中,即Department类不负责维护级联关系.即维护者是Employee类 Department类: package com.javabean; import java.io.Serializa

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

非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通过id进行维护与建文件 原文地址:https://www.cnblogs.com/classmethond/p/10562396.html

借助hibernate自动建表

? Hibernate的ORM关系映射底层框架,为我们的开发提供了很多便利,可以说是一个非常棒的J2EE框架,我这里也不 切入主题,逆向思维,借助hibernate实现快速开发.前提,打算在项目里使用hibernate框架开发底层.仅此而已. 一般情况下,开始一个项目,首先是系统的分析需求,然后就是设计数据库,然后找个数据库客户端开始建表,建字段这是个 漫长的过程,然后开工.如果使用hibernate框架(我当然非常推荐使用),jdbc有点麻烦,很多重复的体力活,也不易维护 拓展.当然我也不否定

在应用hibernate框架操作数据库时,是先建表还是先建类?

先建表 可以用myeclipse反转生成类 还可以生成映射文件(更加方便) 先建类 可以设置hibernate属性动态生成表 但映射文件要自己选 在做项目时,首先都会进行数据分析,会形成数据字典.当数据字典出来以后,我们可以根据数据字典写sql语句建表,也可以根据这份数据字典写实体类或实体类映射文件,然后再生成数据表.通过表生产实体类这一过程叫做反向工程.不过现在公司开发采用反向工程的比较多,因为数据表通常都会在编码前设计好,相对较稳定,这样有利于程序员编码等后期工作.

Hibernate不能自动建表解决办法【转载】

  最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且在mysql中新建了一个hibernate数据库,仅此而已.然而预想不到的事情发生了--程序写好之后,运行,报错        Hibernate: insert into news_table (title, content) values (?, ?)        Exception in thre

[转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言

最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且在mysql中新建了一个hibernate数据库,仅此而已.然而预想不到的事情发生了……程序写好之后,运行,报错Hibernate: insert into news_table (title, content) values (?, ?) Exception in thread "main&quo