No.1

映射一对多双向关联关系:

当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象。

步骤一:

注意:hibernate要求在持久化类中定义集合类属性时,必须把属性类型设置为接口类型(如:java.util.Set)

优点:声明接口类型可以提高持久化类型的透明性,当hibernate调用setEmp()时,传递的参数是hibernate自定义的该接口的类的实例,

如果把setEmp()设置成java.util.HashSet,就强迫hibernate只能把HashSet类的实例作为参数传递。

例:

javabean

public class Department {
private Integer id;
private String name;
private Set<Employee> employees=new HashSet<Employee>();
@Override
public String toString() {
return "Department [id=" + id + ", name=" + name +"]";
}
//get,set方法省略.....
}
☆定义Employee类
public class Employee {
private Integer id;
private String name;
private Department dept;
//get,set方法省略.....
}

这样可以提高程序的健壮性,避免应用程序访问取值为null的Emp集合而抛出的空指针异常,因为该集合不为null。

步骤二:

编写hbm.xml配置文件

1.

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity">
<class name="Dept" table="DEPT">
<id name="did" type="int" column="DID">
<generator class="native">
</generator>
</id>
<property name="name" type="string" column="NAME"/>
<set name="set" cascade="save-update" inverse="true">
<key column="deptNo"></key> <!-- key:这里是多的一方定义的外键 -->
<one-to-many class="Emp"/> <!-- 多的一方的实体类型 -->
</set>
</class>
</hibernate-mapping>

2.

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity">
<class name="Emp" table="EMP">
<id name="eid" type="int" column="EID">
<generator class="native">
</generator>
</id>
<property name="ename" type="string" column="ENAME"/>
<many-to-one name="dept" class="Dept" column="deptNo"></many-to-one>
</class>
</hibernate-mapping>

<set>元素包含以下属性:

1)name:设定待映射的持久化类的属性名,这里为dept类的set属性。

2)cascade:当取值为“save-update",表示级联保存和更新。

<set>元素还包含两个子元素:<key>和<one-to-many>,<one-to-many>元素设定所关联的持久化类,此处为Dept类,<key>元素

设定与所关联的持久化类对应的表的外键(也就是多的一方定义的外键)。

而hibernate从此配置获取以上信息:

*<set>元素表明emp集合:类型为java.util.Set

*<class>子元素表明emp集合中存放的一组emp对象。

*<key>子元素表明emp通过deptNo参照dept表。

*cascade属性取值“save-update“,表明当保存更新dept时,会级联保存或更新Emp集合中的数据!

步骤三:

大配置如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory> <!-- Database connection settings 数据库连接设置-->
<!-- 驱动类 -->
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<!-- url地址 -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">Y2162</property>
<property name="connection.password">1</property> <!-- SQL dialect (SQL 方言) -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!--在控制台打印后台的SQL语句 -->
<property name="show_sql">true</property> <!-- 格式化显示SQL -->
<!-- <property name="format_sql">true</property> --> <!-- 自动生成student表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 关联小配置 -->
<mapping resource="entity/Emp.hbm.xml" />
<mapping resource="entity/Dept.hbm.xml" />
<!-- <mapping class="cn.happy.entity.Grade"/> --> </session-factory>
</hibernate-configuration>

步骤四:编写测试类

public static void one()
{
Dept de=new Dept();
Emp em=new Emp();
Session session = ElectronicUtil.getSession();
Transaction tx = session.beginTransaction();
de.setName("运维部");
em.setEname("发哥");
em.setDept(de);
de.getSet().add(em);
session.save(de);
tx.commit();
System.out.println("success");
session.close();
}

一对多双向关联完成!!!!!

浅谈cascade和inverse

1:首先明确cascade和inverse的作用:

inverse:决定是否把对象中集合的改动反映到DB中,所以inverse只对集合起作用,也只有one-to-many和many-to-many有效,因为只有这两种关系有集合(而many-to-one和one-to-one只含有关系对方的一个引用)。

cascade:决定是否把对象的改动反映到DB中,所以,cascade对所有的关联关系都起作用。

2:inverse:inverse所描述的是对象之间关联关系的维护方式。

inverse:只存于集合标记的元素中。

inverse的作用是:把对象中对集合的改动反映到DB中

inverse的默认值是:false,表示集合的改动反映到DB中,inverse:false为主动方,由主动方负责维护关联关系。

inverse为true:表示不将改动过的集合反映到数据库中。

一对多:该属性在多的一方。应在少的一方设置inverse属性:true,而多的一方设置为false,这说明关联关系由多的一方来维护,如果

要少的一方维护,就会使插入或删除时一方去update多的一方每一个与这个对象有关系的对象,如果交给多的一方来维护,则会大大提高

了效率(因为关系就是在多的一方中,直接插入或删除就好了嘛)

多对多:属性存在独立表中。inverse属性默认为false;在多对多的关系中,关系两端的inverse不能都设置为false,如果都设置为false,则在插入操作时会导致关系表中插入两次关系,也不能都设置成true(任何操作都不会影响到关系表中的数据)

,因此在任意一方设置为true,另一方设置为false;

No.2 多对多双向关联

步骤一: 实体类的创建

public class Employee implements java.io.Serializable {
// Fields
private Integer empid;
private String empname;
private Set<Project> projects = new HashSet<Project>();
...其他内容省略
}
02.创建Project持久化类
public class Project implements java.io.Serializable {
private Integer proid;
private String proname;
private Set<Employee> employees = new HashSet<Employee>();
...其他内容省略
}

步骤二:创建hbm.xml文件

?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>
<class name="cn.happy.daymanymany.Employee" table="EMPLOYEE">emploee
<id name="empid" type="java.lang.Integer">
<column name="EMPID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="empname" type="java.lang.String">
<column name="EMPNAME" length="32" not-null="true" />
</property>
<set name="projects" inverse="true" table="PROEMP">promp
<key column="REMPID"/><!-- 表PROEMP的外键REMPID -->
<many-to-many class="cn.happy.daymanymany.Project" column="RPROID" />
</set>
</class>
</hibernate-mapping>
<?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>
<class name="cn.happy.daymanymany.Project" table="PROJECT">
<id name="proid" type="java.lang.Integer">
<column name="PROID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="proname" type="java.lang.String">
<column name="PRONAME" length="32" not-null="true" />
</property>
<set name="employees" table="PROEMP" cascade="save-update">
<key column="RPROID" />
<many-to-many class="cn.happy.daymanymany.Employee" column="REMPID" />
</set>
</class>
</hibernate-mapping>

通过第三张表的外键关联两个类的多对多关系

大配置同上:步骤三:编写测试类

public void addTest(){
Emp emp=new Emp();
emp.setEmpname("大美丽");
Project pro=new Project();
pro.setPname("中央支援地方");
pro.getEmps().add(emp);
emp.getPros().add(pro);
session.save(pro);
session.save(emp);
}


hibernate之关联映射的更多相关文章

  1. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

  2. Hibernate的关联映射——双向1-N关联

    Hibernate的关联映射--双向1-N关联 对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系.双线的1-N关联和N-1关联是两种相同 ...

  3. Hibernate的关联映射——单向1-N关联

    Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...

  4. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  5. Hibernate的关联映射——单向N-1关联

    Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...

  6. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  7. 初识Hibernate之关联映射(二)

    上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...

  8. Hibernate的关联映射关系

    一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...

  9. 关于Hibernate的关联映射

    何为关联映射 由于数据库的表与表之间存在的管理关系,可以分为一对一,一对多和多对多关联,一般情况下,在数据库设计中是通过表的外键来建立各种关系的,在Hibernate中则把数据库表与表之间的关系数据映 ...

  10. Hibernate框架--关联映射,一对多,多对多 inverse cascade

    回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...

随机推荐

  1. 学习笔记——关于HTML(含HTML5)的块级元素和行级(内联)元素总结

    1.首先我们要知道什么是块级元素和行级(内联)元素? 块级(block)元素的特点: ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度: ...

  2. SQL SERVER代码生成器必备

    写代码生成器的时候经常用到的SQL 1.表添加注释 EXECUTE sp_addextendedproperty N'MS_Description', N'表注释', N'user', N'dbo', ...

  3. Mac下的Parallel Windows忘记密码怎么办?

    Mac机上安装了Parallel Windows,日久年深不登录结果忘记了登录密码,百爪挠心,想破脑壳试了n个密码都不行,放了一个多月也没想起来. 今天没事网上溜溜,肯定也有和我同病相怜的弟兄,果然, ...

  4. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q4-Q5)

    Question 4 You are designing a SharePoint 2010 application to store 50 GB of digital assets, includi ...

  5. [Android]基于RxJava、RxAndroid的EventBus实现

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4578699.html  Github:https://gith ...

  6. iOS自动布局进阶用法

    本文主要介绍几个我遇到并总结的相对高级的用法(当然啦牛人会觉得这也不算什么). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以 ...

  7. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

    今天在运行一个老ios项目的时候,突然报错:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VAL ...

  8. iOS 跳转到系统的设置界面

    跳到健康设置   上网找了一下  你会发现很难找到.代码如下  不信你试试 . NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy& ...

  9. Android对应用程序签名

    1.首先签名是个什么东西. 应用程序签名就是为你的程序打上一种标记,来作为你自己的标识. 2.为什么要进行数字签名 这是Android系统的要求,每一个应用程序必要要经过数字签名才可能安装到系统中,能 ...

  10. IT行业常见职位职业路线图

    我曾经面试过一些计算机相关毕业的应届生,问他希望做什么工作时,他回答只要是软件开发就好了,再细问一下你了解到的软件开发是怎样的?除了软件开发,还有其它什么工作?就答不出来了. 这里我先给出一张IT知识 ...