hibernate中配置单向多对一关联,和双向一对多

什么是一对多,多对一?双向多对一和双向一对多是不是同一个概念?

  是一个概念,双向多对一和双向一对多都是配置一个 一对多和多对一

  一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多

    多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是多 父亲是1

  

 总结:

  •   一对多就是: 1找到n
  •   多对一就是: n找到1

有些人写概念写一大堆搞起我之前是一脸懵逼,还好弄懂了(手动滑稽)

配置单向多对一

  通过上面我们可以了解,双向一对多是 1找n,因为区县有总有很多街道,虽然有的街道没有名字(滑稽),下面我将拿街道和区县举例,实体类的getset我就省略了

   //编号
    private Integer id;
    //街道名称
    private String name;
    //所属区县编号
    private Integer district_Id;
    //所属区县
    private District district;

因为要找所属区县,所以就增加了一个类类型的变量.

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "E:/codeIdea/hibernate_config/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
     <class name="cn.pojo.Street" table="street">
        <id name="id" column="id" type="java.lang.Integer">
            <!--设置主键自动增长就不多说了-->
            <generator class="increment"/>
        </id>
        <property name="name" type="string" column="name"/>
        <!--
            关联查询District类
            name是指Street类中的district属性
            column是指district表中外键
            class这个就不用多说了 District实体类的路径
            cascade的save-update表示 对街道进行添加或更新时会对 县区进行添加或更新
         -->
        <many-to-one name="district"
                     column="district_Id"
                     class="cn.pojo.District"
                     cascade="save-update"/>
    </class>
</hibernate-mapping>

我们来看下配置完后是否可以查询到区县

dao层

public Street findDistrct(Serializable id){
        return (Street)HibernateUtil.currentSession().get(Street.class,id);
    }

service层

  public Street getStreet(Integer id){
        Transaction tx=null;
        Street streets=null;
        try {
            tx=HibernateUtil.currentSession().beginTransaction();
            //获取持久对象 注意这里没 commit() 因为延迟加载的原因所以没有commit
            streets = street.findDistrct(id);
        } catch (HibernateException e) {
            e.printStackTrace();
            if(tx!=null)
                tx.rollback();
        }
        return streets;
    }

测试

StreetServiceImpl streetService = new StreetServiceImpl();
System.out.println(streetService.getStreet(1001).getDistrict().getName());

结果:

配置双向一对多

实体类属性 多了一个set因为是 1找n 所以是一个set因为set不允许重复值

    //编号
    private Integer id;
    //区县名称
    private String name;
    //街道
    private Set<Street> streetSet;

双向多对一就是在上面的基础上加了个一对多即成了双向,

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "E:/codeIdea/hibernate_config/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.pojo.District" table="district" schema="scott">
        <id name="id" column="id" type="java.lang.Integer">
            <!--设置自动增长不多讲了-->
            <generator class="increment"/>
        </id>
        <property name="name" type="string" column="name"/>
        <!--
            name同上
            inverse默认false  是否将对集合对象的修改反映到数据库中 false自己控制,true对方控制
            key 是street表中的外键
            class同上
        -->
        <set name="streetSet" inverse="true">
            <key column="district_Id"/>
            <one-to-many class="cn.pojo.Street"/>
        </set>
    </class>
</hibernate-mapping>

配置完1找n后我们再来查询下

dao层

public District getDistrct(Integer id){
        return (District)HibernateUtil.currentSession().get(District.class,id);
    }

service层

public Set<Street> findStreet(Integer id){
        Transaction tx=null;
        Set<Street> streets=null;
        try {
            tx=HibernateUtil.currentSession().beginTransaction();
            //得到持久状态的对象
            District distrct = distrctDao.getDistrct(id);
            //得到set
            streets=distrct.getStreetSet();
        } catch (HibernateException e) {
            e.printStackTrace();
            if(tx!=null)
                tx.rollback();
        }
        return streets;
    }

测试

DistrctServiceImpl ds = new DistrctServiceImpl();
Iterator<Street> streetIter = ds.findStreet(1004).iterator();
while (streetIter.hasNext()){
    System.out.println(streetIter.next().getName());
}

数据库的数据

结果

对双向一对读关联进行更新

dao 层

  public Street findDistrct(Serializable id){
        return (Street)HibernateUtil.currentSession().get(Street.class,id);
    }

service层 这里为了快点就没传参了 直接调用即可

public void updateStreet(){
    Transaction tx=null;
    try {
        //打开事务
        tx=HibernateUtil.currentSession().beginTransaction();
        //获得持久层对象
        Street streets = street.findDistrct(1000);
        //对区县进行修改
        streets.getDistrict().setName("京城");
        //提交事务
        tx.commit();
    } catch (HibernateException e) {
        e.printStackTrace();
        if(tx!=null)
            tx.rollback();
    }
}

我们来看看数据库没运行之前

运行之后 可以看到 知春路所属的区县改变了

原文地址:https://www.cnblogs.com/hfx123/p/9997903.html

时间: 2024-10-01 06:51:34

hibernate中配置单向多对一关联,和双向一对多的相关文章

Hibernate单向“多对一”关联

1. 基于外键关联的单向"多对一"关联是最常见的单向关联其中指定many-to-one的unique="true",为单向"一对一",不指定就是单向"多对一" <class name="Person">    <id name="id" column="personId"><generator class="native&quo

一口一口吃掉Hibernate(六)——多对多关联映射

今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就是典型的多对多关联的例子.而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据.而双向关联映射则是A,B两端都可以操作另一端的数据. 先说单向关联映射,实体类如下: <span style="font-size:18px">/** * 学生类 * @author Lo

Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o

Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 主要的对象黑头配置磊个关联,三 1 3. Criteria 黑头配置关联查询了... 2 4. Ati Meata 配置关联 @CriteriaRelt 2 5. 关联createCriteria() 3 6. Criteria的使用outline 4 7. 参考:: 5 1. Criteria,,Criterion ,,

017 多对多关联映射 双向(many-to-many)

多对多关联映射 双向 两方都持有对象引用,修改对象模型,但数据的存储没有变化. 再修改映射文件: public class Role { private int id; private String name; private Set users;//users对象的集合 public int getUsers() { return users; } public void setUsers(int users) { this.users= users; } public int getId()

Hibernate 中配置属性详解(hibernate.properties)

Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数.多数配置参数都 有比较直观的默认值, 并有随 Hibernate一同分发的配置样例hibernate.properties 来展示各种配置选项. 所需做的仅仅是将这个样例文件复制到类路径 (classpath)下并做一些自定义的修改. 属性1.Hibernate JDBC属性 属性名 用途 hibernate.connection.driver_class jdbc驱动类 hibernate.connection.ur

hibernate的基础学习--多对多关联

多对多采用学生老师模型进行测试 学生配置文件: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd&quo

Hibernate学习之单向多对一映射

? 版权声明:本文为博主原创文章,转载请注明出处 说明:该实例是通过映射文件和注解两种方式实现的.可根据自己的需要选择合适的方式 实例: 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apa

Hibernate 中的 单向 一 对多 关系

之前看过 一本书  ,里面介绍 hibernate 的时候 反复强调了 不要  轻易 设置 单向的 一对多 关系 书中解释的原因是 影响 性能 (生成 的 sql 语句变多). 单向的 多 对 1 关系      外键依赖: 通过在 @ManytoOne 后  跟上 @CasCade 先persist从表记录,再persist主表记录时: 判断 主表没有相应记录的时候,从表等待主表插入记录后再插入(2条sql) 连接表: 两个实体类表 不存在 任何 依赖关系,连接表 依赖 这两个 实体类表. 两

精通Hibernate——建立单向多对一关联

在类与类之间各种各样的关系中,要算多对一的单向关联关系和关系数据库中的外键参照关系最匹配了.因此,通常选择从Order到Customer的多对一单向关联.简要代码如下: public class Customer implements Serializable{ private Long id; private String name; .... } public class Order implements Serializable{ private Long id; private Stri