Hibernate学习笔记(3)---hibernate关联关系映射

一对一关联

假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系

1,通过主键关联(个人偏向另外一种)

User.hbm.xml文件配置

<id name="userid" type="java.lang.Integer">
            <column name="userid" />
            <!-- 主键关联,将主键生成策略改为foreign,表明由关联类来生成主键,
            	即直接使用另外关联类的主键值,该实体类不能生成主键 -->
            <generator class="foreign" />
             <para name="property">address</para><!--  -->
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="12" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="16" />
        </property>
<one-to-one name="address" class="Address" constrained="true"></one-to-one></span>

  Addrss.hbm.xml文件配置

<id name="addressid" type="java.lang.Integer">
            <column name="addressid" />
            <generator class="identity" />
        </id>
        <property name="addressinfo" type="java.lang.String">
            <column name="addressinfo" length="12" />
        </property>

  

2通过外键关联

两张表主键不同,通过给一张表添加外键列来保持一对一关系,所以在user 表中加入address_id

直接在原始的User配置文件加入下行代码

 <!-- class属性:另外个实体类,将其的address属性映射为address表的外键address_id,
        unique指定一对一映射
         -->
        <many-to-one name="address" class="Address" unique="true">
        <!-- 外键 -->
            <column name="address_id"></column>
        </many-to-one>

  

一对多关联映射

还是上方例子为例,一个用户拥有多个地址

第一步:在一的一方表示出多(即在用户中表示多)

在User.java表示多,生成get,set方法

private Set<Address> setAddress = new HashSet<Address>();  

    public Set<Address> getSetAddress() {
        return setAddress;
    }
    public void setSetAddress(Set<Address> setAddress) {
        this.setAddress = setAddress;
    }

  第二步:在Address.java表示一

  

private User user;
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}

  

第三步:配置Uesr.hbm.xml与Address.hbm.xml的基本映射

第四步:在一的配置文件(User.hbm.xml)配置多的一方

 <!--set集合名称 -->
    <!--hibernate机制,双向维护外键       columen 外键名称-->
     <key column="user_address"></key>
     <one-to-many class="Address全路径"/>
</set>

  第五步:在多的配置文件(Address.hbm.xml)配置一的一方

<!--name属性 写address.java表示的user-->
    <many-to-one name="user" class="User全路径"  column="外键名"></many-to-one>

  

多对多的关联映射

多对多一般创建第三张中间表来维护两个表之间关系

场景:公司里面一个用户有多个角色,一个角色就多个用户

第一步:创建实体类对象(user  ,role)

第二步:在user.java表示role和在role.java表示user

user.java表示role

private Set<Role> setRole = new HashSet<Role>();
public Set<Role> getSetRole() {
    return setRole;
}
public void setSetRole(Set<Role> setRole) {
    this.setRole = setRole;
}

  role.java表示user

private Set<User> setUser = new HashSet<User>();  

    public Set<User> getSetUser() {
        return setUser;
    }
    public void setSetUser(Set<User> setUser) {
        this.setUser = setUser;
    }

  

第三步:配置两个类的基本映射

第四步:分别在配置文件中配置

user配置role

<!--
    name  角色set集合名称
    table 第三张表的名称
     -->
    <set name="setRole" table="t_ub">
    <!-- 配置当前映射文件在第三张表外键名称 -->
        <key column="uid"></key>
        <many-to-many class="路径" column="rid"></many-to-many>
    </set>

  role配置user

 <!--
name  角色set集合名称
table 第三张表的名称
 -->
<set name="setUser" table="t_ub">
<!-- 配置当前映射文件在第三张表外键名称 -->
    <key column="bid"></key>
    <many-to-many class="路径" column="uid"></many-to-many>
</set>

  

由于t_user表与t_role没有外键关联,可以直接进行crud操作,两表的关系通过第三张表来维护(后面会写第三张表的维护)

时间: 2024-11-08 20:43:41

Hibernate学习笔记(3)---hibernate关联关系映射的相关文章

Hibernate学习笔记(2)Hibernate问题

(1)数据库驱动问题 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" org.hibernate.HibernateException: JDBC Driver class not found: com.m

Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理

一.初识Hibernate 1.JDBC的缺点: 1).编写代码的时候过于繁琐,try和catch比较多2).没有做数据缓存 3).不是面向对象编程 4).sql语句固定,可移植性差 JDBC的优点:效率比较高 2.Hibernate优点 1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存3).跨平台性强 4).使用场合多应用于企业内部的系统 Hibernate缺点 1).效率低 2).表中的数据如果在千万级别,则hibernate不适合 3).如果表与表

Hibernate学习笔记(三) — Hibernate 的一级缓存意义

什么是缓存? 缓存说白了,就是应用程序向数据库要数据,然后把一些数据,临时的放在了内存的区域中,第二次再要数据的时候,直接从内存中拿即可. 缓存需要解决的事情: 1.能把数据放入缓存 2.能把数据从缓存中取出来 3.如果缓存中的数据发生变化,需要把数据同步到数据库中 4.把数据库中的数据同步到缓存中 5.hits命中率低的对象应该及时从缓存中移走 分布式缓存: 为什么会有分布式缓存? 应用程序运行在服务器上,并发访问时,服务器压力过大,分布式缓存就是来分担服务器压力的. 分布式缓存之间的数据是同

Hibernate学习笔记(六) — Hibernate的二级缓存

我们知道hibernate的一级缓存是将数据缓存到了session中从而减少与数据库的交互.那么二级缓存呢? 一.应用场合 比如,在12306购票时,需要选择出发地与目的地,如果每点一次都与数据库交互一次,这就很不合适,这些地点数据在相当长的一段时间内是不会发生变化的(山东省在相当长的时间内还叫山东省),所以应该缓存起来,没必要每次都与数据库交互,而且该类数据安全性也不是很高. 适合二级缓存的数据: 在现代软件开发中,确实存在一类数据没有什么私有性,为公开的数据,数据基本上不发生变化,该数据保密

hibernate学习笔记之一 hibernate简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架 hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

Hibernate学习笔记(九) — Hibernate的查询

Hibernate共提供以下三种检索方式 HQL检索方式: 1.通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数 2.动态绑定参数 3.调用 Query 的 list() 方法执行查询语句. 该方法返回java.util.List 类型的集合, 在 List 集合中存放了符合查询条件的持久化对象. 4.Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例 Hiber

Hibernate学习笔记(3)

两年前曾经学习过Hibernate,也通过博客将Hibernate的学习过程记录下来了,地址如下: Hibernate学习笔记(1) Hibernate学习笔记(2) 最近在复习Hibernate,在重新学习的过程中,有了一些新的体会和收获,现在将其总结成博客,供以后作为参考资料使用. 一.导入相应的jar包 目前Hibernate更新到了4.x版本,在官网下载后,找到lib文件加中的required文件夹,此外还需要额外导入log4j和数据库驱动包. 二.创建Hibernate配置文件 在sr

《Hibernate学习笔记八》:组件映射

<Hibernate学习笔记八>:组件映射 前面介绍了一对一的单向.双向外键关联,例如,学生证和学生是一个一对一的关系.这篇博文主要是介绍下组件映射,即一个是另一个的一部分,例如,学生证的信息也可以作为学生信息的一部分,即在数据库中只存在学生一个表,而不是有学生和学生证两个表,并且这两个表中有一个一对一的关联关系. 如下: 有人或许会说,那我们就将学生和学生证的信息写在一个类中,则就不需要组件映射了,确实可以这样,但是,根据类的设计原则,我们一般都会将其设计为两个类,然后将学生证的信息作为一个

《Hibernate学习笔记九》:多对一和一对多的关联关系

<Hibernate学习笔记九>:多对一和一对多的关联关系 前面介绍了一对一的关联关系在Hibernate应该如何来实现,这篇博文就来介绍下多对一和一对多的关联关系. 多对一和一对多的关联关系在我们的生活中也比较常见,例如,在我们学生时代,一个班级可以有多个学生,而一个学生只能属于一个班级,这就是一个多对一(一对多)的例子: 还有在我们的工作中,一个工作小组可以有多个用户,而一个用户只能属于一个小组,这也是一个多对一(一对多)的关系的例子. 1.多对一的单向关联关系 下面就以一个工作小组可以有

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输