`
- 浏览:
264829 次
- 性别:
- 来自:
北京
-
学习脚步----hibernate编程中的映射关系简单片面分析一下(自己学习)
注:在hibernate编程中的映射关系中用的最多的就是一对多多对一,下面通过一个小案例分析(cascade的使用和效果)来对最简单的进行阐述:(个人学习笔记)[size=x-small]三个类:
Cateory :
package entity;
public class Category {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Topic:
package entity;
public class Topic {
private int id;
private String name;
private Category cate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCate() {
return cate;
}
public void setCate(Category cate) {
this.cate = cate;
}
}
Msg:
package entity;
public class Msg {
private int id;
private String name;
private Topic to;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Topic getTo() {
return to;
}
public void setTo(Topic to) {
this.to = to;
}
}
三个配置文件:
Category.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Category" table="cate">
<id name="id" column="cid">
<generator class="native" />
</id>
<property name="name"
column="cname"
not-null="true" />
</class>
</hibernate-mapping>
Topic.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Topic" table="topic">
<id name="id" column="tid">
<generator class="native" />
</id>
<property name="name"
column="tname"
not-null="true" />
<many-to-one name="cate" column="cate"></many-to-one>
</class>
</hibernate-mapping>
Msg.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Msg" table="msg">
<id name="id" column="mid">
<generator class="native" />
</id>
<property name="name"
column="mname"
not-null="true" />
<many-to-one name="to" column="topic"></many-to-one>
</class>
</hibernate-mapping>
Cateory——> Topic——>Msg
1. 删除msg中的一条记录级联删除msg所对应的topic;
假设要删除的msg所对应的topic的id是1,写如下代码:
session.beginTransaction();
Msg msg=(Msg)session.get(Msg.class, 1);
session.delete(msg);
session.getTransaction().commit();
配置文件不做任何修改,那么删除的只是msg中的记录,topic中的记录依然存在。
如果在Msg.hbm.xml配置文件中修改为<many-to-one cascade=”all” name="to" column="topic"></many-to-one>,那么在运行上面代码的时候就分为两种情况了:1>如果msg表中topic为1的仅有要删除的那条msg是,那么结果就是:msg中的该条记录删除,topic表中topic的id为1的记录删除;2>如果如果msg表中topic为1的除了要删除的那条msg是还有别的msg使用的topic的id也是1,那么运行上面的代码的时候就会报错,原因是msg中外键字段在使用这id为1的topic记录。
删除msg中的一条记录级联删除msg所对应的topic的id所对应的所有的msg;
将Topic类修改为:
package entity;
import java.util.*;
public class Topic {
private int id;
private String name;
private Category cate;
private Set<Msg> msgs=new HashSet<Msg>();
public Set<Msg> getMsgs() {
return msgs;
}
public void setMsgs(Set<Msg> msgs) {
this.msgs = msgs;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCate() {
return cate;
}
public void setCate(Category cate) {
this.cate = cate;
}
}
将Topic.hbm.xml修改为:
<class name="Topic" table="topic">
<id name="id" column="tid">
<generator class="native" />
</id>
<property name="name"
column="tname"
not-null="true" />
<many-to-one name="cate" column="cate"></many-to-one>
<set name="msgs">
<key column="fk"/>
<one-to-many class="entity.Msg"/>
</set>
</class>
则在运行:(Msg.hbm.xml中设置了cascade=“all”)
session.beginTransaction();
Msg msg=(Msg)session.get(Msg.class, 1);
session.delete(msg);
session.getTransaction().commit();
这段代码的时候结果是:msg表中的那条记录没有了,topic表中id为1的记录没有了,msg中其他使用topic的id为1的做外键的,外键字段全部变为NULL。
如果将Topic.hbm.xml修改为:
<class name="Topic" table="topic">
<id name="id" column="tid">
<generator class="native" />
</id>
<property name="name"
column="tname"
not-null="true" />
<many-to-one name="cate" column="cate"></many-to-one>
<set cascade="all" name="msgs">
<key column="fk"/>
<one-to-many class="entity.Msg"/>
</set>
</class>
运行上面的结果是:msg表中的那条记录没有了,topic表中id为1的记录没有了,msg中其他使用topic的id为1的做外键的记录也全部删除了。
[b]案例总结:开始的时候Topic和Msg是单向的多对一的外键关联:Msg中有Topic的对象做属性,Msg.hbm.xml中进行了<many-to-one cascade=”all” name=”topic” column=”fk”/>的配置,而另一方不进行任何的特殊配置。
配置了<many-to-one>就相当于是设置了从Msg到Topic的导航,Cascade=”all”的意思是:在对我Msg表做插入、删除、更新的时候,通过导航跟我关联的Topic也进行相应的操作。
后来,在Topic类中添加了Msg的set集合,并且在Topic的配置文件中添加了<set cascade="all" name="msgs"><key column="fk"/> <one-to-many class="entity.Msg"/></set>,那么就从设置了从Topic到Msg的导航。cascade="all"的意思是在对我Topic表进行插入、删除、更新操作的时候,通过导航跟我关联的Msg也进行相应的操作。[/b][/size]
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在Hibernate中,每个Java实体类通常对应一个`.hbm.xml`映射文件,其中包含了对象-关系的映射信息。例如,`<class>`元素表示一个Java类,它的`name`属性是类的全限定名,`table`属性指定对应的数据库表。`<id>`元素...
在 Hibernate 中,映射关系是将数据库表与 Java 类之间的关联方式,使得对象模型可以与关系模型无缝对接。本篇文章将详细探讨 Hibernate 中的多种映射关系。 1. **一对一映射 (One-to-One)** 一对一映射表示两个...
Hibernate对象关系映射一对多 很基础等文档
对象-关系映射—Hibernate 培训 (中文) 目录 一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳...
Hibernate是目前广泛使用的持久层框架,它采用对象关系映射(ORM)技术,将Java对象映射到关系型数据库中。在使用Hibernate进行数据持久化操作时,如何处理实体之间的关联关系是一个非常重要的方面。实体关联关系映射...
Hibernate是Java平台上的一款开源对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的...
Hibernate Tools是开发者在使用Hibernate框架进行Java应用程序开发时的重要辅助工具,它为Eclipse IDE提供了强大的集成支持,包括对象关系映射(ORM)的可视化设计、逆向工程、数据库生成、HQL和SQL查询编辑等功能。...
本文将深入探讨Hibernate的关联映射学习,包括一对多、多对一、一对一等多种关系映射的方式。 首先,我们来看一下“一对多”(One-to-Many)的映射关系。在Hibernate中,这种关系通常用在一个实体可以拥有多个子...
HCA的核心在于提供了一系列的注解,如`@Entity`、`@Table`、`@Column`、`@Id`等,这些注解用于标记Java类和类的成员,以便于Hibernate理解如何将它们映射到数据库中的表和字段。例如,`@Entity`注解标记一个类为实体...
在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便更好地管理和操作数据。这篇文章将深入探讨Hibernate中的集合映射机制,包括其基本概念、类型以及如何在实际开发中进行...
在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Eclipse作为主流的Java集成开发环境,其丰富的插件生态使得开发效率得以提升。"hibernatetools-Update-4.1.1.Final_...
本文档主要聚焦于Hibernate框架下继承关系的映射,通过三种不同的策略——隐式继承映射、单表映射和关联表映射,来实现类的继承结构在数据库中的映射。 ### 隐式继承映射 #### 定义与配置 隐式继承映射也称为“表...
Hibernate是一个强大的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库,将Java对象与数据库表之间的映射关系自动化。Dialect在Hibernate中起着至关重要的作用,它定义了特定数据库的SQL语法、...
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。本文将深入探讨Hibernate5中的映射关系,主要包括多对多(Many-to-Many)和一对多(One-to-Many)...