hibernate单向一对多级联操作

主类  User     单方

从类  UserIp  多方要求结果:操作USER类,自动添加USERIP并维护关联关系

为了节省篇幅,忽略了get/set方法 请自行添加

User类代码:


public class User {

/**用户的ID*/
    private long id;

 /**登录用户名*/
    private String username;
    
    /**登录密码*/
    private String password;

 /**IP集合*/
    private Set<UserIp> userIps=new HashSet<UserIp>();

 /**--------get/set----------*/

}

UserIp类:


public class UserIp {
    
    /**数据库ID*/
    private long id;
    
    /**用户ID*/
    private long userId;
    
    /**IP地址*/
    private String ip;

  /**--------get/set----------*/

}

User.hbm.xml:

<hibernate-mapping>
    <class name="com.entity.User" table="user" lazy="false" dynamic-insert="true">
    <id name="id" type="long" column="id">
         <generator class="native" />
    </id>
    <property name="username" column="username" />
    <property name="password" column="password" />
    <set name="userIps" table="user_has_ip" cascade="all-delete-orphan" lazy="false" inverse="false">
          <key column="user_id" /><!-- 确定关联的外键列 -->
          <one-to-many class="com.entity.UserIp" />
    </set>
    </class>
</hibernate-mapping>

UserIp.hbm.xml:

<hibernate-mapping>
    <class name="com.entity.UserIp" table="user_has_ip" lazy="false">
        <id name="id" type="long" column="id">
            <generator class="native" />
        </id>
       <property name="ip" column="ip"/>
    </class>
</hibernate-mapping>

其中关键就在于

inverse="false"   控制反转,不增加这个参数的话,默认也为false,可以理解为true时,放弃级联关系维护权。

cascade="all-delete-orphan"

all-deleteorphan 的能力:
1. 当保存或更新父方对象时,级联保存或更新所有关联的子方对象,相当于 cascade 为 save-update
2. 当删除父方对象时,级联删除所有关联的子方对象,相当于 cascade 为 delete
3. 删除不再和父方对象关联的所有子方对

通过此设置,只需要操作User类,即可对UserIp类做增删改查关联关系维护等操作。。

时间: 2024-08-06 10:22:16

hibernate单向一对多级联操作的相关文章

Hibernate单向多对一级联删除引发的问题

Hibernate单向多对一在级联删除时,会出现一些问题. 下面模拟我遇到的问题: 这次模拟与之前的一次模拟方法一直,博客:http://blog.csdn.net/openjdk8/article/details/38424403 模拟场景:有一个部门表t_dept,职位表t_position. 需求:当删除部门表时,不管职位表有没数据,照样删除.删除职位表就直接删除. 1,建表: 建表: t_dept::部门表 t_position:职位表 CREATE TABLE t_dept(    d

再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN

声明: 1.本文系原创,非抄袭或转载过来的. 2.本文论点都亲手做过实验论证. 3.本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供. 非常多人对持久层概念搞不清JPA.Hibernate.EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是详细的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session B

Hibernate 配置文件属性之 级联操作cascade 性能优化inverse

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping pack

Hibernate单向“一对多”关联

1. 基于连接表的单向"一对多"关联,应该优先被采用其中指定many-to-many的unique="true",为单向"一对多",不指定就是单向"多对多" <class name="Person">    <id name="id" column="personId"><generator class="native"

【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作

这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制. 依旧用部门和员工举例.多个员工相应一个部门(多对一关联关系) 员工类:Employee.java package cn.itcast.hibernate.domain; public class Employee { private int id; private String name; private Department depart; public int getId() { return id; } pu

(十一)Hibernate中的多表操作(1):单向一对多

一.单向一对多() 案例一(用XML文件配置): 一个会员(Member)可以有多个订单(Order),加载会员的时候自动加载订单,但是订单无法查看会员信息, public class Member { private String id; private String name; private Integer age; private Set<Order> orders = new HashSet<Order>(); //该Set集合里存放的是"多"方,加载

hibernate的中的查询与级联操作

1.Criteria查询接口适用于组合多个限制条件来搜索一个查询集. 要使用Criteria,需要遵循以下步骤: *创建查询接口: Criteria criteria=session.createCriteria(User.class); *设置查询条件: criteria.add(Restrictions.gt("age",10); *查询数据:      List<User> list=criteria.list(); 2.关系映射:一个用户(cust_customer

Hibernate级联操作解密(inverse和cascade)

总结: Cascade:对级联操作进行限制,有如下几个参数: all : 所有情况下均进行关联操作.  none:所有情况下均不进行关联操作.这是默认值.  save-update:在执行save/update/saveOrUpdate时进行关联操作.  delete:在执行delete时进行关联操作. Inverse:在一对多模型中,只能在一的一方设置,inverse的作用就是在级联发生后,会再次更新子表数据的外键为主表的主键.确保子表外键不会为空. 下面演示一个班级学生的例子(一对多): 班

Hibernate级联操作和加载机制(二) cascade and fetch

上一篇介绍了Hibernate持久化对象时候的级联操作,本篇介绍读取时候的级联操作. 还是用上一篇的例子,一份问卷有多个问题,但是每个问题只能属于一份问卷.我们先看测试用例: @Test public void testReadFromQuestionnaire(){ Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); Questionnaire qn = (Questionnaire