Hibernate 单向的一对多关联映射

Stella981
• 阅读 382

单向的一对多关联关系(One to Many)

对象模型关系分析:

少的一端:会通过引用一个多端的集合对象,建立对象模型关系

多的一端:没有任何变化,不知道和少的一端存在着关系。

关系模型分析:

少的一端:没有任何变化

多的一端:会和少的一端建立外键关系

使用时需要少的一端所对应的XXX.hbm.xml中进行配置

       

       

       

注意:

注意:

在有映射关系的实体类中,对于普通属性会进行数据的立即加载,而对于非普通属性默认采用的是延迟加载。

可以在XXX.hbm.xml关联文件中通过指定lazy="false" 采取立即加载方式。

对延迟加载的对象也可以使用Hibernate.initialize(Object proxy);方法进行强制初始化。

package model;

/**
 * @author sally
 * 单向的多对一
 * 少的一端
 */
public class Dept {

    private int id;
    private String deptName;
    
    public Dept(){
        
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    
}

package model;

import java.util.Date;

/**
 * 
 * @author sally
 * Many to One
 * 多的一端
 */
public class Employee {

    private int id;
    private String empName;
    private Date hiredate;
    
    //对一端的引用
    private Dept dept;
    
    public Employee(){
        
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }
    
}

<?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>
    <!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->
    <class name="model.Dept" table="dept_tab">
        <!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
            <!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="deptName" type="string"></property>
    </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>
    <!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->
    <class name="model.Employee" table="emp_tab">
        <!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
            <!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="empName" type="string"></property>
        <property name="hiredate" type="timestamp"></property>
        <!-- 用 many-to-one 元素映射多对一关联
             name属性:指定关联的属性名
             column属性:指定此关联属性在数据库表中的外键字段名 -->
        <many-to-one name="dept" column="dept_id"></many-to-one>
        
    </class>    
</hibernate-mapping>

<!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>
        <!-- 配置连接数据库的参数 -->
        <!-- 配置数据库的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///m2o</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
         <property name="hibernate.show_sql">true</property>
         <!-- 其它属性配置 -->
        <!-- 指明C3P0的提供者 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!-- 连接池参数的配置 -->
        <property name="hibernate.c3p0.min_size">5</property> 
        <property name="hibernate.c3p0.max_size">30</property> 
        <property name="hibernate.c3p0.timeout">1800</property> 
        <property name="hibernate.c3p0.max_statements">50</property>
        
        <!-- 打印SQL语句到控制台 -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property> 
        <!-- 注册实体的对象关系映射文件 -->
        
        <mapping resource="model/Dept.hbm.xml"/>
        <mapping resource="model/Employee.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

package test;

import java.util.Date;

import model.Dept;
import model.Employee;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import util.HibernateUtils;

public class EmployeeTest {

    @Test
    public void createTable(){
        Configuration cfg=new Configuration().configure();
        SchemaExport se=new SchemaExport(cfg);
        se.create(true, true);
    }
    
    @Test
    public void save(){
        Session session=HibernateUtils.getSession();
        Transaction ts=session.beginTransaction();
        
        //在单向的多对一中,要先添加少的一端
        Dept dept=new Dept();
        dept.setDeptName("财务部");
        session.save(dept);
        
        Employee emp=new Employee();
        emp.setEmpName("zhangsan");
        emp.setHiredate(new Date());
        emp.setDept(dept);
        session.save(emp);
        
        ts.commit();
        HibernateUtils.close(session);
    }
    
    @Test
    public void get(){
        Session session=HibernateUtils.getSession();
        Transaction ts=session.beginTransaction();
        
        Employee emp=(Employee)session.get(Employee.class, 1);
        System.out.println(emp.getEmpName()+"---->"+emp.getHiredate());
        Hibernate.initialize(emp.getDept());
        //Dept dept=emp.getDept();
        //System.out.println(dept.getId()+"-->"+dept.getDeptName());
        ts.commit();
        HibernateUtils.close(session);
    }
    
}

package util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

    private static SessionFactory factory;
    static{
        factory=new Configuration().configure().buildSessionFactory();
    }
    public static SessionFactory getFactory(){
        return factory;
    }
    
    public static Session getSession(){
        return factory.openSession();
    }
    
    public static void close(Session session){
        if(session!=null){
            session.close();
        }
        
    }
    
}
点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Go 语言编程 — gorm 的数据完整性约束
目录文章目录目录实体完整性(主键约束)用户定义完整性(非空约束、唯一约束、检查约束和默认值)参照完整性(外键约束)关联关系一对一、一对多关联多对多关联示例实体完整性(主键约束)每个关系(表)至少存在一个主
Stella981 Stella981
2年前
Django之ORM(多对多)
一、ManyToManyField1、classRelatedManager"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况:1.外键关系的反向查询2.多对多关联关系简单来说就是当 点后面的对象 可能存在多个的时
Stella981 Stella981
2年前
Django中模型层中ORM的多表操作
ORM的多表创建(一对一.一对多,多对多):1模型创建  实例:我们来假定下面这些概念,字段和关系作者模型:一个作者有姓名和年龄。作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(onetoone)出版商模型:出版
Wesley13 Wesley13
2年前
mysql面试题及答案
01\.列举常见的关系型数据库和非关系型都有那些?1.关系型数据库通过外键关联来建立表与表之间的关系,常见的有:SQLite、Oracle、mysql2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定常见的有:MongoDb、redis02\.MySQL常见数据库引擎
Stella981 Stella981
2年前
Hibernate利用关联关系操纵对象
Hibernate利用关联关系操纵对象数据对象之间关联关系有一对一、一对多及多对多关联关系。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。本节讲解如何在Hibernate中处理这些对象之间的关联关系。本节使用到4个类,它们分别是Student(学生)、Card(学生证)、Group(班级)和Cou
Wesley13 Wesley13
2年前
@OneToMany、@ManyToOne以及@ManyToMany讲解(五)
一、一对多(@OneToMany)1、单向一对多模型假设通过一个客户实体可以获得多个地址信息。对于一对多的实体关系而言,表结构有两种设计策略,分别是外键关联和表关联。(1)映射策略外键关联在数据库中表customer和表结构address定义,如下:createtablecustomer(
Stella981 Stella981
2年前
Django框架(七):模型(三) 关联、模型类的属性
1\.关联1.1模型类关系关系型数据库的关系包括三种类型:ForeignKey:一对多,将字段定义在多的一端中。ManyToManyField:多对多,将字段定义在任意一端中。OneToOneField:一对一,将字段定义在任意一端中。1.1.1一对多关系
Wesley13 Wesley13
2年前
3 OneToMany ManyToMany MappedBy Cascade
1双向1N关联对于1N关联,Hibernate推荐使用双向关联,而且不要让1的一方控制关联关系,而使用多的一方控制关联关系。a.一的一方 表示班级@Entity@Table(name"team_1")publicclassTeam{@Id@Gen
Wesley13 Wesley13
2年前
MySQL关于用户关注粉丝表的设计方案
一、数据结构分析用户关注粉丝是一个多对多的数据模型,分析对象的数据特征,我们给每个用户设计一个关注者属性和粉丝属性,用于存储用户的关注者id和粉丝id,如用户1:$arr1\'follow''\2,3,4\,'fans'\4,5,6\,\二、用户逻辑关系梳理
LeeFJ LeeFJ
1年前
Foxnic-SQL (16) ——Foxnic-SQL的模型关联方法
本节我们将用一个简单的例子,来说明对象之间的关联关系,以及FoxnicSQL是如何处理这种关联关系的。首先,我们引入商城下单的简单业务模型,这个模型里面包括了商品、订单、订单明细以及收件人地址,这个模型足够简单,所以很容易分析出他们之间的关联关系。