Hibernat之关系的处理一对多/多对一

第一步:编写两个pojo,比如一个学生表一个班级表  这里使用注解。

需要

班级表:

 1 package com.qcf.pox;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.OneToMany;
13 import javax.persistence.Table;
14
15 import org.hibernate.annotations.Cascade;
16 import org.hibernate.annotations.Formula;
17 //实体类
18 @Entity
19 @Table(name="_class")
20 public class ClassName {
21     @Id
22     @GeneratedValue(strategy=GenerationType.AUTO)//设置id生成方式
23     private int classid;
24     @Column(name="classname")
25     private String name;
26     /*
27      * 用一个查询语句动态的生成一个类的属性. 表示这个属性是一个虚拟的列,表中并没有这个列。需要通过查询语句计算出来。
28      */
29     //@Formula("(select count(*) from student s where s.className_classid=classid)")
30     private int num;
31     /*
32      * mappedBy指定谁来维护关系,mappedBy在一方表示由多方来维护关系,在进行操作时要注意不要使用这一方来save,update等操作
33      */
34     @OneToMany(mappedBy="classname",cascade=CascadeType.ALL)
35     private Set<Student> students=new HashSet<Student>();
36
37     public ClassName(int classid, String name, int num, Set<Student> students) {
38         super();
39         this.classid = classid;
40         this.name = name;
41         this.num = num;
42         this.students = students;
43     }
44     public Set<Student> getStudents() {
45         return students;
46     }
47     public void setStudents(Set<Student> students) {
48         this.students = students;
49     }
50     public int getClassid() {
51         return classid;
52     }
53     public void setClassid(int classid) {
54         this.classid = classid;
55     }
56     public String getName() {
57         return name;
58     }
59     public void setName(String name) {
60         this.name = name;
61     }
62     public int getNum() {
63         return num;
64     }
65     public void setNum(int num) {
66         this.num = num;
67     }
68     public ClassName(int classid, String name, int num) {
69         super();
70         this.classid = classid;
71         this.name = name;
72         this.num = num;
73     }
74     public ClassName() {
75         super();
76     }
77
78
79 }

学生表:

 1 package com.qcf.pox;
 2
 3 import java.util.Date;
 4
 5 import javax.persistence.Entity;
 6 import javax.persistence.FetchType;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.GenerationType;
 9 import javax.persistence.Id;
10 import javax.persistence.ManyToOne;
11
12 @Entity
13 public class Student {
14
15     @Id
16     @GeneratedValue(strategy=GenerationType.AUTO)//代表主键的生成策略
17     private int stuno;
18     private String stuname;
19     private Date birthday;
20
21     @ManyToOne
22     private ClassName classname;
23     public int getStuno() {
24         return stuno;
25     }
26     public ClassName getClassName() {
27         return classname;
28     }
29     public void setClassName(ClassName className) {
30         this.classname = className;
31     }
32     public void setStuno(int stuno) {
33         this.stuno = stuno;
34     }
35     public String getStuname() {
36         return stuname;
37     }
38     public void setStuname(String stuname) {
39         this.stuname = stuname;
40     }
41     public Date getBirthday() {
42         return birthday;
43     }
44     public void setBirthday(Date birthday) {
45         this.birthday = birthday;
46     }
47     public Student() {
48         super();
49     }
50     public Student(int stuno, String stuname, Date birthday) {
51         super();
52         this.stuno = stuno;
53         this.stuname = stuname;
54         this.birthday = birthday;
55     }
56
57 }

第二步:在hibernate.cfg.xml文件中引入这两个po类

1         <!-- 引入映射文件 -->
2
3         <mapping class="com.qcf.pox.Student"/>
4         <mapping class="com.qcf.pox.ClassName"/>

第三步:编写测试代码

 1 package com.qcf.test;
 2
 3 import java.util.Date;
 4
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.cfg.AnnotationConfiguration;
 9 import org.hibernate.cfg.Configuration;
10
11 import com.qcf.pox.ClassName;
12 import com.qcf.pox.Student;
13
14 public class TestManyToOne {
15     public static void main(String[] args) {
16         //获取hibernate配置文件并取得session对象
17         Configuration configuration=new AnnotationConfiguration().configure();
18         SessionFactory factory=configuration.buildSessionFactory();
19         Session session=factory.openSession();
20         //开启事务
21         Transaction transaction=session.beginTransaction();
22         //创建classname实例
23         ClassName className=new ClassName();
24         className.setName("java");
25
26         //创建student实例
27         Student student=new Student();
28
29         student.setStuname("zhangsan");
30         student.setBirthday(new Date());
31         student.setClassName(className);
32         session.save(className);
33         session.save(student);
34         //提交事务
35         transaction.commit();
36         //关闭session
37         session.close();
38     }
39
40 }

问题:

  在测试代码中,我让学生多方来维护关系,而且级联设置的为全部,这里为什么在测试代码中还有先save班级表再save学生呢?为什么不能只在save学生表?

时间: 2024-12-09 09:18:16

Hibernat之关系的处理一对多/多对一的相关文章

PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本)

  1:运行  PowerDesigner15_Evaluation.exe 默认   2: 安装完毕后,不要执行,下面我们进行 破解 把 PowerDesigner15汉化+注册补丁  下的所有文件,覆盖 PD的安装目录下的文件 然后我们打开 PD,点击 帮助 –> About  看到下面窗口中红色方框,就表示已经破解 + 汉化成功 PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本)

Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set<String> address; private List<String> addressList = new ArrayList<String>(); //private Str

hibernate 一对多|多对一

一对多:(一个客户对应多个联系人) 客户实体:Customer.java package cn.future.domain; import java.util.HashSet; import java.util.Set; public class Customer { /* * CREATE TABLE `cst_customer` ( `cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)', `cust_name` VAR

框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)

一级缓存 概念 *在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java集合构成了Session缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 *当session的save()方法持久化一个对象时,该对象被载入缓存, 以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中. 当试图get(). load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库.没有再查询数据库 *Session 能够在

JPA总结——实体关系映射(一对多@OneToMany)

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom

DjangoORM一对多&多对多操作

简要说明 通过操作对象的方式操作数据库 详细步骤 models.py的结构是: 如果models.py中外键定义没有写 related_name='student_teacher', 可以直接用 studentList = teacher.student_teacher.all() 可以改写成: teacher = Teacher.objects.get(id = 1) studentList = teacher.student_set.all() =======================

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

session 原理及ORM 一对多 多对多的关系

一.SESSIN 原理 首先客户端访问服务器时生成一个COOKIE,服务器上有一个专门保存客户端访问服务器时COOKIE的SESSION 字典,  当客户端去访问服务器时,发送COOKIE 请求 去服务器SESSION字典认证,如果字典里没有,则生成SESSION 字符串保存到SESSION 字典中,然后返回给客户端,保存到COOKIE里,下次再访问服务器时 拿着此字符串去服务器端认证. 代码如下 #!/usr/bin/env python # -*- coding:utf-8 -*- impo