关系:事物之间相互作用、相互联系的状态。范围最大。

联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。

关联:表示对象之间的关系,既有数量性,又有方向性;动词:将对象之间通过某种方式联系起来。

映射:这里指java对象和数据库表的一种对应关系。动词:形成这种对应关系。

级联:有关系的双方中操作一方,另一方也将采取一些动作。

关联的联系种类

在不考虑关联的方向前提下,联系就是关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。

一对一联系(1:1):如用户和身份证、一夫一妻

一对多联系(1:n):如班级和学生

多对多联系(m:n):如学生和选课

关联的方向

关联关系的方向可分为单向关联和双向关联。

双向关联的方向其实就不重要了,因为通过任一一方都可以维护彼此的关系。也就是说:在双向关联中一对多和多对一都是一样的。

利用Java Project项目演示试用Hibernate技术添加数据到数据库


1 建立项目之后首先呢肯定是需要导入相关的JAR包的

2 然后是创建实体类

package cn.itcast.hiberate.sh.domain;

public class Student {
private Long sid;
private String sname;
private String description;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", description="
+ description + "]";
} }
package cn.itcast.hiberate.sh.domain;

import java.util.Set;

public class Classes {
private Long cid;
private String cname;
private String description;
private Set<Student> students;
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Set<Student> getStudents() {
return students;
}
@Override
public String toString() {
return "Classes [cid=" + cid + ", cname=" + cname + ", description="
+ description + ", students=" + students + "]";
}
public void setStudents(Set<Student> students) {
this.students = students;
} }

Student映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name的值代表的是一个实体 -->
<class name="cn.itcast.hiberate.sh.domain.Student">
<!-- id用于指定主键 column,主键在数据库表列 , increment,主键自增 -->
<!-- length,指定长度 type,类型,也可以不写 -->
<id name="sid" length="5" type="java.lang.Long">
<generator class="increment"></generator>
</id>
<!-- 表示表中普通的属性 -->
<property name="sname" length="20" type="java.lang.String"></property>
<property name="description" length="100" type="java.lang.String"></property>
</class>
</hibernate-mapping>

Class映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name的值代表的是一个实体 -->
<class name="cn.itcast.hiberate.sh.domain.Classes">
<!-- id用于指定主键 column,主键在数据库表列 , increment,主键自增 -->
<!-- length,指定长度 type,类型,也可以不写 -->
<id name="cid" length="5" type="java.lang.Long">
<generator class="increment"></generator>
</id>
<!-- 表示表中普通的属性 -->
<property name="cname" length="20" type="java.lang.String"></property>
<property name="description" length="100" type="java.lang.String"></property>
<!-- set元素和实体类中的 private Set<Student> students; 相对应 -->
<!--
set元素对应类中的set集合
通过set元素使classes表与student表建立关联
key是通过外键的形式让两张表建立关联
one-to-many是通过类的形式让两个类建立关联 cascade 级联
save-update
1、当 保存班级的时候,对学生进行怎么样的操作
如果学生对象在数据库中没有对应的值,这个时候会执行save操作
如果学生对象在数据库中有对应的值,这个时候会执行update操作
delete
all
inverse 维护关系
true 不维护关系
false 维护关系
default false
-->
<set name="students" cascade="save-update">
<!--
key是用来描述外键
-->
<key column="cid"></key>
<one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
</set>
</class>
</hibernate-mapping>

3 然后是配置文件 hibernate.cfg.xml

<?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只能连接一个数据库
-->
<session-factory>
<!--
数据库的用户名
-->
<property name="connection.username">root</property>
<!--
密码
-->
<property name="connection.password">root</property>
<!--
url
-->
<property name="connection.url">
jdbc:mysql://localhost:3306/itcast_sh_hibernate
</property>
<!--
作用:根据持久化类和映射文件生成表
validate
create-drop
create
update
-->
<property name="hbm2ddl.auto">update</property>
<!--
显示hibernate内部生成的sql语句
-->
<property name="show_sql">true</property>
<mapping resource="cn/itcast/hiberate/sh/domain/Classes.hbm.xml" />
<mapping resource="cn/itcast/hiberate/sh/domain/Student.hbm.xml" /> </session-factory>
</hibernate-configuration>

4 hibernate创建 sessionfactory 的工具类

package cn.itcast.hibernate.sh.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Before; public class HibernateUtils {
public static SessionFactory sessionFactory;
public static String url;
// 需要在加载的时候就进行配置
@Before
public void init(){
// 创建 Configuration 对象
Configuration configuration = new Configuration();
// 加载配置文件
configuration.configure(url);
sessionFactory = configuration.buildSessionFactory();
}
}

5 测试类   需要注意的是,hibernate 可以创建相对应的表,但是 数据库需要自己先创建好

package cn.itcast.hibernate.sh.test;

import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.itcast.hiberate.sh.domain.Classes;
import cn.itcast.hiberate.sh.domain.Student;
import cn.itcast.hibernate.sh.utils.HibernateUtils; public class TestOneToMany extends HibernateUtils{
static{
url="/hibernate.cfg.xml";
}
// 建表
@Test
public void testCreateTable(){ }
// 创建一个班级
/**
* Hibernate: select max(cid) from Classes
Hibernate: insert into Classes (cname, description, cid) values (?, ?, ?)
*/
@Test
public void save_classes(){
Session session = sessionFactory.openSession();
// 除了查询之外的操作都需要使用事务
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setCname("峡谷1");
classes.setDescription("召唤师峡谷");
session.save(classes); // 将临时状态的对象转换成持久化状态
transaction.commit();
session.close();
}
// 创建一个学生
/**
* Hibernate: select max(sid) from Student
Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
*/
@Test
public void save_student(){
// session 的实质可以看为一个数据库连接
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("黑铁");
student.setDescription("菜");
session.save(student);
transaction.commit();
session.close();
}
// 创建一个班级的时候同事创建一个学生,级联同时维护关系所以student表的外键也有值了
/**
* Hibernate: select max(cid) from Classes
Hibernate: select max(sid) from Student
Hibernate: insert into Classes (cname, description, cid) values (?, ?, ?)
Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
Hibernate: update Student set cid=? where sid=?
*/
@Test
public void saveClasses_cacade_saveStudent(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setCname("峡谷2");
classes.setDescription("召唤师峡谷2");
Student student = new Student();
student.setSname("白银呢");
student.setDescription("还是菜");
Set<Student> students = new HashSet<Student>();
students.add(student);
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
}
// 存在一个班级,新建一个学生
/**
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_,
* classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_,
students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
Hibernate: select max(sid) from Student
Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
Hibernate: update Student set cid=? where sid=?
*/
@Test
public void test_classes_saveStudent(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes) session.get(Classes.class, 4L);
Student student = new Student();
student.setSname("白白");
student.setDescription("有点菜");
// classes 是持久化状态 可以直接添加
classes.getStudents().add(student);
session.save(classes);
transaction.commit();
session.close();
}
// 存在一个学生,新建一个班级
/**
* Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_,
* student0_.description as descript3_1_0_ from Student student0_ where student0_.sid=?
Hibernate: select max(cid) from Classes
Hibernate: insert into Classes (cname, description, cid) values (?, ?, ?)
Hibernate: update Student set cid=? where sid=?
*/
@Test
public void test_student_saveClasses(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student) session.get(Student.class, 1L);
Classes classes = new Classes();
classes.setCname("峡谷3");
classes.setDescription("召唤师峡谷3");
Set<Student> students = new HashSet<Student>();
students.add(student);
classes.setStudents(students);
// 临时状态的 classes 需要 save
session.save(classes);
transaction.commit();
session.close();
}
// 存在一个 班级和学生 ,将其建立连接
/**
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_,
* classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_,
student0_.description as descript3_1_0_ from Student student0_ where student0_.sid=?
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_,
students0_.sname as sname1_0_, students0_.description as descript3_1_0_
from Student students0_ where students0_.cid=?
Hibernate: update Student set cid=? where sid=? */
@Test
public void updateClasses_cascade_updateStudent(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes) session.get(Classes.class, 2L);
Student student = (Student) session.get(Student.class, 5L);
classes.getStudents().add(student);
transaction.commit();
session.close();
}
// 把一个学生从一个班级解除关系
/**
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_,
* classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_,
students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description
as descript3_1_0_ from Student students0_ where students0_.cid=?
Hibernate: update Student set cid=null where cid=? and sid=?
*/
@Test
public void test_release(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes) session.get(Classes.class, 2L);
Set<Student> students = classes.getStudents();
for(Student s : students){
if(s.getSid() == 5){
students.remove(s);
}
}
// 解除了学生5的关系
transaction.commit();
session.close();
}
// 解除一个班级下面的一些学生的关系
@Test
public void test_releaseR(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes) session.get(Classes.class, 2L);
Set<Student> students = classes.getStudents();
for(Student s : students){ students.remove(s); }
// 解除了班级2下面的关系
transaction.commit();
session.close();
}
// 删除学生
/**
* Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_,
* student0_.description as descript3_1_0_ from Student student0_ where student0_.sid=?
Hibernate: delete from Student where sid=?
*/
@Test
public void testDelete(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student) session.get(Student.class, 5L);
session.delete(student);
transaction.commit();
session.close();
}
// 删除班级
/**
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: update Student set cid=null where cid=?
Hibernate: delete from Classes where cid=?
删除班级的同时级联删除了 学生表中相应的外键
*/
@Test
public void test_deleteClasses(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes) session.get(Classes.class, 5L);
session.delete(classes);
transaction.commit();
session.close();
}
}

用于记忆整理,欢迎各位大神来指点

hibernate的映射关系之一对多的更多相关文章

  1. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  2. Hibernate中的映射关系(一对多)

    在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique= ...

  3. Hibernate4.x之映射关系--单向一对多

    在领域模型中,类与类之间最普遍的关系就是关联关系在UML中,关联是有方向的 以Customer和Order为例:一个用户能发出多个订单,而一个订单只能属于一个客户.从Order到Customer的关联 ...

  4. Nhibernate 映射关系,一对多 多对一与多对手在映射文件中的体现。

    今天做了第一个Nhibernate项目,摸着石头过河,学到了一些东西,在这里将自己总结体会到的一些映射关系写出来,与大家分享,由于是初学者,如果有不对的地方希望大家能够指出来. 首先要说明要建立的几张 ...

  5. hibernate 继承映射关系( SINGLE_TABLE)

    三种继承映射关系.   1,SINGLE_TABLE   person student  teacher 在一个表中,student和teacher继承自person,通过一个Discriminato ...

  6. java框架篇---hibernate(一对一)映射关系

    对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从 ...

  7. Hibernate关联映射之_一对多

    domain: package org.zln.hibernate.domain; import java.util.Set; /** * 部门Domain对象 * Created by sherry ...

  8. Hibernate学习——映射关系

    学习记录 O(∩_∩)O . 如果你恰巧路过,希望你能停下脚步瞧一瞧,不足之处望指出,感激不尽~ 使用工具: 1.eclipse   2.hibernate压缩包(hibernate_4.3.11)  ...

  9. hibernate 中映射关系配置

    多对多 : 外键维护权,一方放弃inverse="true",并且不放弃维护权的一方,加入 cascade="save-update":推荐方案 Student ...

随机推荐

  1. ViewPager 滑动一半的判断方法以及左滑右滑判断

    做项目的时候,会碰到用viewpager + fragments去实现多页滑动.有些时候需要完成:界面在滑动到一半或是一半以上的时候,需要把title之类的切换到下一个页面.这个时候仅仅依赖Viewp ...

  2. linux下mysql的大小写是否区分设置

    转:http://blog.csdn.net/qq_29246225/article/details/52293549 一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分 ...

  3. 对VC++6.0爱得深沉(一)安装vc++6.0,支持winXP,win7,win8.1,win10

    [欢迎入坑] 从这里起,我称VC++6.0为小c. 为什么我对小c爱得深沉? 虽然饱受非议,但是,我只想说,我太单纯,小c轻轻松松成功运行在各个win平台,对于我来说她:高速.小巧.便捷.听话.可定制 ...

  4. 完全关闭IIS日志,包括System32下的LogFile

    早上突然发现网站访问不了了,登陆服务器一看,是C盘满了. 查一看,是IIS产生了70多G的日志,但明明已关闭日志了,还是会产生. 产生的目录在:C:\Windows\System32\LogFiles ...

  5. webstorm中关于vue的一些问题

    在进行vue开发中,我使用了webstorm,但是过程坎坷艰辛,遇到了很多问题,我将问题和解决方案贴上,以作参考. 1.vue项目部署在webstorm中,第一个遇到的问题是,webstorm卡住了, ...

  6. java类的equals()函数和hashCode()函数用法

    以前总觉得java类对象很简单,但是今天的一个同事的点播,让我对java的对象有了不一样的理解,下面我来介绍一下equals()和hashCode()的用法: 先粘一段代码: public class ...

  7. java实现八种排序算法并测试速度(详细)

    算法代码: /** * Created by CLY on 2017/3/17. */ package pers.cly.sorting; /** * 排序工具类,里面包含各种排序方法 */ publ ...

  8. python学习随笔(三)

    在linux中输入密码,我们是看不到的,如果在python中直接输入是可以看的到的,执行以下程序 #!/usr/bin/env python username = raw_input("us ...

  9. 第2章Zabbix基础进阶

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  10. (删)Java线程同步实现二:Lock锁和Condition

    在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...