Hibernat之关系的处理一对多/多对一
第一步:编写两个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之关系的处理一对多/多对一的更多相关文章
- EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)
在上一篇文章中, http://www.cnblogs.com/joeylee/p/3790980.html 我们用 PD15.1 来设计了数据库,并且生成 了sql数据库,现在我们用 vs2013 ...
- SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份
SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法
CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- hibernate中一对多多对一关系设计的理解
1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...
- 2018.11.4 Hibernate中一对、多对多的关系
简单总结一下 多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件 一: 多: 操作: 操作管理级别属 ...
- JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明
JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
随机推荐
- 持久化redis
redis持久化 Redis持久化原理: Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snap ...
- 它们的定义PropertyPlaceHolder无法完成更换任务
Spring默认PropertyPlaceholderConfigurer只能加载properties格风格简介,现在,我们需要能够从类的完整支持允许似hadoop格风格xml配置文件读取配置信息,并 ...
- javascript 模块化编程 1
var myModule=(function(){ var models={}; function define(name,deps,cb){ var tk=[]; for(var i=0,l=dep ...
- 关于int全区变量读写的原子性
关于int全区变量读写的原子性 关于int变量的读写是否原子性网上有非常多讨论,貌似不同平台不同,这里自己做实如今arm9平台測试.这里要注意原子性并不是指一条汇编才原子,实际上即使一次赋值编 ...
- SQL入门学习5-函数、为此、CASE表达式
6-1. 各种各样的函数 函数的种类 算数函数 字符串函数 日期函数 转换函数 聚合函数 1.1算术函数 数据类型:NUMERIC 是大多数DBMS都支持的一种数据类型. 通过NUMBERIC(全体位 ...
- Maven直接部署Web应用Tomcat
1. 下载解压版tomcat,并配置环境变量.所以tomcat你可以成功启动. 使用版本解压tomcat可以方便查看tomcat的后台输出的出错信息,便于调试. 2. 给tomcat配置用户名密码. ...
- 翻译器DIY它———算在英文文本中的单词数,字符和行数
咳咳.这部分应该是序列化编译器DIY的,然而,在这样做DIY第一次使用前flex 为了练练手,对于后者的理解是有帮助. 在word 我经常看到一个字计数功能,因此,它是如何实现,当然,首先想到的是要经 ...
- Android监视返回键
android在发展中,监视键返回到后事件经常被用来,在下面的例子来说明什么android返回键事件监听器. public class BackKeyTest extends Activity { / ...
- 【LaTeX排版】LaTeX纸排版<两>
1.文件夹的生成 直接使用命令\tableofcontents就可以. 其默认格式例如以下: 我们会发现.这种格式不一定是我们所期望的. 比方说,我们也希望章标题与页码之间也有点连线,而且也希 ...
- RTP 记录 log 该机制
我们 RCV 在这里,经常跑concurrent request RTP: Receiving Transaction Processor, 它主要是用来处理 RCV_TRANSACTIONS_INT ...