Hibernate级联

本文介绍Hibernate框架中多对一与一对多关系的实现方式,包括实体类定义、映射文件配置及懒加载解决方案。通过具体代码示例展示了如何建立部门与员工之间的关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多对一
案列 从domain和映射文件开始写
懒加载的解决
这里写图片描述
3、open 过滤器

pojo

package net.hibernate.pojo;

public class EMP_0511 implements java.io.Serializable{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Dept_0511 dept;


public EMP_0511() {

}
public EMP_0511(String name) {
    this.name = name;
}
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Dept_0511 getDept() {
    return dept;
}
public void setDept(Dept_0511 dept) {
    this.dept = dept;
}
}
package net.hibernate.pojo;

import java.util.HashSet;
import java.util.Set;


public class Dept_0511{
    private Integer id;
    private String name;
    private Set<EMP_0511> emps=new HashSet<EMP_0511>();

    public Dept_0511() {
    }
    public Dept_0511(String name) {
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<EMP_0511> getEmps() {
        return emps;
    }
    public void setEmps(Set<EMP_0511> emps) {
        this.emps = emps;
    }   
}

hbm.xml

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

<hibernate-mapping package="net.hibernate.pojo">

    <class name="EMP_0511">
        <id name="id" type="integer">
            <generator class="native"/>
        </id>
        <property name="name" type="string">

        </property>

        <!--dept属性用来说明与 雇员和部门类之间的多对1关系 本方有外键 deptid -->
        <many-to-one name="dept" class="Dept_0511" column="deptId"></many-to-one>
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.hibernate.pojo">

    <class name="Dept_0511" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name">
        <column name="name" length="64" not-null="true"></column>
        </property> 
        <!-- set集合用来说明部门和雇员一对多的关系有   deptId -->
        <set name="emps">
            <key column="deptId"></key>
            <one-to-many class="EMP_0511"/>
        </set>  
    </class>
</hibernate-mapping>

测试

package net.hibernate.view;

import java.util.Date;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import net.hibernate.pojo.Dept_0511;
import net.hibernate.pojo.EMP_0511;
import net.hibernate.view.util.HibernateUtil;

public class TestMain {

    public static void main(String[] args) {
        // 完成crud操作
        //一对多,多对一
//      insertEmp();
//懒加载,因为session关闭,拿不到getdept的值,有三种方法解决
        EMP_0511 emp=selectByOne();
        System.out.println(emp.getDept().getName());

    }

    public static void insertEmp() {

        Session session = HibernateUtil.getSession();
        // 事务
        Transaction tr = session.beginTransaction();
        try {
            // 在构造两个员工
            EMP_0511 emp = new EMP_0511();
            emp.setName("苏东坡");
            EMP_0511 emp1 = new EMP_0511();
            emp1.setName("秦观");
            Dept_0511 dept = new Dept_0511();
            // 构造一个部门对象
            dept.setName("文化部");
            // 告诉部门你有2个员工
            dept.getEmps().add(emp);
            dept.getEmps().add(emp);

            // 告诉员工属于那个部门
            emp.setDept(dept);
            emp1.setDept(dept);

            // 保存、提交
            session.save(dept);
            session.save(emp);
            session.save(emp1);
            tr.commit();
        } catch (Exception e) {
            e.printStackTrace();
            if (tr != null) {
                tr.rollback();
            }
        } finally {
            if (tr != null && session.isOpen()) {
                session.close();
            }

        }
    }
     public static void updateEmp(){
     //1、获取 2、修改
     Session session=HibernateUtil.getSession();
     Transaction tr=session.beginTransaction();
     // 第一种方法获取
     // Employee emp=(Employee) session.get(Employee.class, 1);
     EMP_0511 emp=(EMP_0511) session.load(EMP_0511.class, 1);
     emp.setName("苏轼");
     tr.commit();
     session.close();
     }
     public static void deleteEmp(){
     //1、获取 2、删除
     Session session=HibernateUtil.getSession();
     Transaction tr=session.beginTransaction();
     // 第一种方法获取
     // Employee emp=(Employee) session.get(Employee.class, 1);
     EMP_0511 emp=(EMP_0511) session.load(EMP_0511.class, 2);
     session.delete(emp);
     tr.commit();
     session.close();
     }
     public static EMP_0511 selectByOne(){
            Session session = HibernateUtil.getSession();
            // 事务
            Transaction tr = session.beginTransaction();
            EMP_0511 emo=null;
            try {
                emo=(EMP_0511) session.get(EMP_0511.class,9);
                Hibernate.initialize(emo.getDept());
            } catch (Exception e) {
                e.printStackTrace();
                if (tr != null) {
                    tr.rollback();
                }
            } finally {
                if (tr != null && session.isOpen()) {
                    session.close();
                }
            }
            return emo;
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值