Hibernate实体关系映射(OneToMany、ManyToOne双边)——完整实例
双边关系是最常见的配置。在多方有一方的引用,一方也有多方的引用。双边关系能够很方便地查询数据。看一个班级与学生的双边关系。
班级(Clazz类)与学生(Student类):一对多关系。班级中有学生属性,学生中有班级属性,二者是双边关系。(Class是关键字,不能用)
分析:Clazz为一方,Student为多方。Clazz中有Student集合属性,Student中也有Clazz类型属性。
环境:MyEclipse10,新建Web Project名为hibernate

1、Clazz.java
Clazz类中有一个id主键、一个name属性、一个List<Student>集合代表该班级内的学生。班级与学生关系是一对多,这里使用@OneToMany配置,并用mappedBy属性配置与该List<Student>属性对应的是Student类中的clazz属性。具体的关联配置都在Student的clazz属性上。
双边关系中,控制权一般交给多方,因此这里的@OneToMany没有设置数据库的外键列,而只配置了一个mappedBy属性,值为clazz,告诉hibernate,配置信息要到Student类的clazz属性中找。
package com.hibernate.bean; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.Table; import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType; @Entity
@Table(name = "tb_class")
public class Clazz { @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id; private String name; @OneToMany(mappedBy = "clazz")
@Cascade(value = CascadeType.DELETE_ORPHAN)
private List<Student> students = new ArrayList<Student>(); // @OneToMany(mappedBy = "clazz")
// @MapKey(name="name")
// private Map<String, Student> students = new HashSet<String, Student>(); public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<Student> getStudents() {
return students;
} public void setStudents(List<Student> students) {
this.students = students;
} }
2、Student.java
Student类中有一个id主键以及name姓名、sex性别两个普通属性,还有一个Clazz类型的属性clazz,代表所在的班级。该属性与Clazz中的List<Student>集合属性是对应的。从逻辑上来讲,某student的clazz属性为某clazz,该clazz的List<Student>中必定还有改student。配置了mappedBy后,hibernate能自动维护这种关系。
Student与Clazz是多对一的关系,多对一使用@ManyToOne配置,另外用@JoinColumn配置关联的列名。这里用tb_student表的class_id列与tb_class的id主键列连接。这里同时配置了级联保存类型为PERSIST,创建student时,会自动将clazz也写进数据库。
package com.hibernate.bean; import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; @Entity
@Table(name = "tb_student")
public class Student { @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id; @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST })
@JoinColumn(name = "class_id") //外键为class_id
private Clazz clazz; private String name; private String sex; public Clazz getClazz() {
return clazz;
} public void setClazz(Clazz clazz) {
this.clazz = clazz;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} }
3、hibernate.cfg.xml(src目录下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@192.168.1.2::orcl</property>
<property name="connection.username">daym2</property>
<property name="connection.password">daym2</property>
<property name="connection.isolation"></property>
<property name="hbm2ddl.auto">create</property>
<property name="javax.persistence.validation.mode">none</property> <!-- SQL方言,这边设定的是Oracle -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="current_session_context">thread</property>
<mapping class="com.hibernate.bean.Cat" />
<mapping class="com.hibernate.bean.Person" />
<mapping class="com.hibernate.bean.Email" />
<mapping class="com.hibernate.bean.Clazz" />
<mapping class="com.hibernate.bean.Student" />
</session-factory>
</hibernate-configuration>
4、TestClazzStudent.java
package com.hibernate.bean;
import java.util.List; import org.hibernate.Session; import com.hibernate.bean.Clazz;
import com.hibernate.bean.Student;
import com.hibernate.bean.HibernateSessionFactory; public class TestClazzStudent { @SuppressWarnings("all")
public static void main(String[] args) throws Exception { Clazz clazz = new Clazz();
clazz.setName("三年二班"); Student student1 = new Student();
student1.setName("周周");
student1.setSex("男"); Student student2 = new Student();
student2.setName("李四");
student2.setSex("女"); Session session = HibernateSessionFactory.getSession();
session.beginTransaction(); // 保存进数据库
session.persist(clazz);
session.persist(student1);
session.persist(student2); // 设置班级
student1.setClazz(clazz);
student2.setClazz(clazz);
// clazz.getStudents().add(student1);
// clazz.getStudents().add(student2); session.getTransaction().commit();
session.close(); session = HibernateSessionFactory.getSession();
session.beginTransaction(); // 查询名为“三年二班”的班级 然后输出学生
Clazz c = (Clazz) session.createQuery(
" select c from Clazz c where c.name = :name ").setParameter(
"name", "三年二班").uniqueResult(); System.out.println("三年二班 的所有学生:");
for (Student s : c.getStudents()) {
System.out.println("\t姓名:" + s.getName() + ", 性别:" + s.getSex());
} // 直接查询班级为“三年二班”的学生
List<Student> students = session.createQuery(
" select s from Student s where s.clazz.name = :name ")
.setParameter("name", "三年二班").list(); System.out.println("三年二班 的所有学生:");
for (Student s : students) {
System.out.println("\t姓名:" + s.getName() + ", 性别:" + s.getSex());
} session.getTransaction().commit();
session.close(); } }
5、log4j.properties (src目录下)
log4j.rootLogger=INFO,stdout
log4j.category.org.hibernate.tool.hbn2ddl=DEBUG
log4j.category.org.hibernate.SQL=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n
Hibernate实体关系映射(OneToMany、ManyToOne双边)——完整实例的更多相关文章
- Hibernate实体关系映射(OneToMany单边)——完整实例
单边一对多关系:电子邮件管理 单边一对多关系:指一方有集合属性,包含多个多方,而多的一方没有一方的引用. 比如:用户(一)与电子邮件(多).一个用户可以有多个电子邮件记录. 目的:通过OneToMan ...
- hibernate 实体关系映射笔记
@经常使用属性说明: @Entity:实体类 @Table:指定相应数据表 @Id:主键,使用能够为null值的类型,假设实体类没有保存到数据库是一个暂时状态 @Col ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- JPA总结——实体关系映射(一对多@OneToMany)
JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...
- hibernate(3) —— 关系映射
hibernate中关系映射指的是实体类与实体类间的关系.和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系. 一:一对一映射 两个对象之间是一对一的关系,如人和身份证之间是 ...
- Hibernate注解关系映射
Hibernate Annotation关系映射的几种类型映射用法及使用方法(说明:以前实例的实体是user和role,主键分别是userid和roleid) 1)一对一外键关联映射(单向) @O ...
- Java IDE 编辑器 --- IntelliJ IDEA 进阶篇 生成 hibernate 实体与映射文件
原文:转:Java IDE 编辑器 --- IntelliJ IDEA 进阶篇 生成 hibernate 实体与映射文件 2011-04-30 12:50 很多人不知道怎么用 IntelliJ IDE ...
- [刘阳Java]_MyBatis_实体关系映射_第8讲
MyBatis既然是一个ORM框架,则它也有像Hibernate那样的一对多,多对多,多对一的实体关系映射功能.下面我们就来介绍一下如何使用MyBatis的实体关系映射 1.MyBatis实体关系映射 ...
- OrchardNoCMS实体关系映射扩展
在OrchardNoCMS中,默认的系统会把实体关系映射保存到mappings.bin文件中. 如果不进行任何修改,默认的可以自动保存关系映射的model是有很大限制的. 条件是model的命名空间必 ...
随机推荐
- Zabbix3.x安装图解教程
准备知识: Zabbix3.x比较之前的2.0界面有了很大的变化,但是安装部署过程与2.x基本完全一样. 1.Zabbix2.x安装图解教程 http://www.osyunwei.com/archi ...
- freemaker时间格式转换,精确到毫秒
在开发中,需要将时间以 2016-09-20 12:00:01:723 的形式里用freemaker展示在页面上,找了好久,终于找到了答案. "createTime":" ...
- Bootstrap_缩略图
缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底下(左侧或右侧)带有标题.描述等信息. Bootstrap框架将这一部独立成一个模块组件.并通过“thumbnail”样式配合 ...
- 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)
第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...
- 浅谈一下关于使用css3来制作圆环进度条
最近PC端项目要做一个这样的页面出来,其他的都很简单,关键在于百分比的圆环效果.我最初打算是直接使用canvas来实现的,因为canvas实现一个圆是很简便的. 下面贴出canvas实现圆环的代码,有 ...
- Markdown学习和插件介绍
markdown能干啥 亲们github上的项目首页的 内容+样式,都是项目中README.md文件控制的.将md风格的代码,转化成html. 而且markdown语法非常简单,5-10分钟即可学会! ...
- mysql mybatis-generator plugin 有page实体类的分页
page实体类 package cn.zsmy.tmp; import java.io.Serializable; /** * 分页对象. * */public final class Page im ...
- Android之mtk上传log
Android之mtk上传log 1,打开浏览器 2.输入地址http://eservice.mediatek.com/eservice-portal/login 3.输入用户名,密码 4.提eser ...
- 搜集资料&安装环境
开始入坑DSP,芯片是TI的TMS320C6678,硬件平台为TI官方的TMS320C6678L开发板. 官方给的资料有很多,各种用户手册.软件支持包,眼花缭乱.先尝试把开发环境搭起来,跑个Hello ...
- 了解真实的『REM』手机屏幕适配
rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...