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

需要

班级表:

 package com.qcf.pox;

 import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table; import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Formula;
//实体类
@Entity
@Table(name="_class")
public class ClassName {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)//设置id生成方式
private int classid;
@Column(name="classname")
private String name;
/*
* 用一个查询语句动态的生成一个类的属性. 表示这个属性是一个虚拟的列,表中并没有这个列。需要通过查询语句计算出来。
*/
//@Formula("(select count(*) from student s where s.className_classid=classid)")
private int num;
/*
* mappedBy指定谁来维护关系,mappedBy在一方表示由多方来维护关系,在进行操作时要注意不要使用这一方来save,update等操作
*/
@OneToMany(mappedBy="classname",cascade=CascadeType.ALL)
private Set<Student> students=new HashSet<Student>(); public ClassName(int classid, String name, int num, Set<Student> students) {
super();
this.classid = classid;
this.name = name;
this.num = num;
this.students = students;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public ClassName(int classid, String name, int num) {
super();
this.classid = classid;
this.name = name;
this.num = num;
}
public ClassName() {
super();
} }

学生表:

 package com.qcf.pox;

 import java.util.Date;

 import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne; @Entity
public class Student { @Id
@GeneratedValue(strategy=GenerationType.AUTO)//代表主键的生成策略
private int stuno;
private String stuname;
private Date birthday; @ManyToOne
private ClassName classname;
public int getStuno() {
return stuno;
}
public ClassName getClassName() {
return classname;
}
public void setClassName(ClassName className) {
this.classname = className;
}
public void setStuno(int stuno) {
this.stuno = stuno;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Student() {
super();
}
public Student(int stuno, String stuname, Date birthday) {
super();
this.stuno = stuno;
this.stuname = stuname;
this.birthday = birthday;
} }

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

         <!-- 引入映射文件 -->

         <mapping class="com.qcf.pox.Student"/>
<mapping class="com.qcf.pox.ClassName"/>

第三步:编写测试代码

 package com.qcf.test;

 import java.util.Date;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration; import com.qcf.pox.ClassName;
import com.qcf.pox.Student; public class TestManyToOne {
public static void main(String[] args) {
//获取hibernate配置文件并取得session对象
Configuration configuration=new AnnotationConfiguration().configure();
SessionFactory factory=configuration.buildSessionFactory();
Session session=factory.openSession();
//开启事务
Transaction transaction=session.beginTransaction();
//创建classname实例
ClassName className=new ClassName();
className.setName("java"); //创建student实例
Student student=new Student(); student.setStuname("zhangsan");
student.setBirthday(new Date());
student.setClassName(className);
session.save(className);
session.save(student);
//提交事务
transaction.commit();
//关闭session
session.close();
} }

问题:

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

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

  1. EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)

    在上一篇文章中, http://www.cnblogs.com/joeylee/p/3790980.html  我们用 PD15.1 来设计了数据库,并且生成 了sql数据库,现在我们用 vs2013 ...

  2. SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份

    SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...

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

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  4. PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法

    CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...

  5. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  6. hibernate中一对多多对一关系设计的理解

    1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...

  7. 2018.11.4 Hibernate中一对、多对多的关系

    简单总结一下 多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件 一: 多: 操作: 操作管理级别属 ...

  8. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  9. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

随机推荐

  1. therefore/so/hence/then/accordingly/Thus

    这几个词的区别大致可从以下几方面去看:1.therefore adv.因此, 所以=for that reason=consequently常用于连接两个并列分句,其前加“and”或分号“:”.He ...

  2. 类似的微博推断客户关系sql声明

    类别似新浪微博的关注和共同关心 不知道别人是怎么设计的. 反正我是例如以下设计的 ID   USER   FRIEND 1     A         B 2      B         A 3   ...

  3. struts详细解释拦截器

    1.拦截器:Struts2拦截器将一个Action要么Action的方法.之前或截取后场,和Struts2拦截器是可插拔,拦截器AOP一种实现. WebWork:拦截器是动态拦截Action调用的对象 ...

  4. RH253读书笔记(2)-Lab 2 System Resource Access Controls

    Lab 2 System Resource Access Controls Goal: To become familiar with system resource access controls. ...

  5. File类基本操作之OutputStream字节输出流

    贴代码了,已经測试,可正常编译 package org.mark.streamRW; import java.io.File; import java.io.FileOutputStream; imp ...

  6. SQL Server中tempdb的管理

    原文:SQL Server中tempdb的管理 资料来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ ht ...

  7. C# - Abstract Classes

     Abstract classes are closely related to interfaces. They are classes that cannot be instantiated, ...

  8. IOS 数据库管理系统(SQLite)

    嵌入式数据库 SQLite嵌入式数据库的优势 1.支持事件,你并不需要配置,无需安装,不需要管理员 2.支持部分脂肪SQL92 3.完整的数据库被存储在磁盘上的文件的顶部,相同的数据库文件可以在不同机 ...

  9. 推荐他们认为有用Sublime Text3小工具

    所有插件package control安装.一些国家的破解版sublime该插件是建立,安装自己的百度没有内置的方法,这里就不再重复 打开sublime.ctrl+shift+P,输入pis回车,稍等 ...

  10. WebHooks

    WebHooks ASP.NET 5 Beta 7 版本   在 VS2015 发布的同时,微软也发布了 ASP.NET 5 的路线图(详见ASP.NET 5 Schedule and Roadmap ...