`

Hibernate对象之间的三种关系

阅读更多

hibernate 对象的三种关系:
one – to – one : 身份证<--->人
one – to – many : 部门 <---> 员工
many-to-one :  员工<--->部门
many-to-many : 学生<--->老师

在实际开发中,如果出现了many-to-many关系,我们应该将其转换成两个one-to-many 或者 many-to-one,这个程序好控制,同时不会有冗余.

单向多对一(Employee - Department)
Employee映射文件
<many-to-one name=”dept” column=”dept_id”/>
class Department{
private Integer id;
private String name;
}
class Employee{
private Integer id;
private String name;
private Department dept;
}
添加一个部门,并给部门加入二个人
public static void add() {
    //把对象模型-》关系模型
    //当你获取一个session ,就会让hiberate去读取
    //hibernate.cfg.xml,这就会加载对象映射文件,从而完成创建
    Session session=null;
    Transaction ts=null;
    try {           
        session=HibernateUtil.getThreadLocalSession();
        ts=session.beginTransaction();           
        //添加一个记录
        Department d1=new Department();
        d1.setName("财务部");
        Employee e1=new Employee();
        e1.setName("张三");
        e1.setDepartment(d1);
        Employee e2=new Employee();
        e2.setName("邵阳");
        e2.setDepartment(d1);           
        session.save(d1);
        session.save(e1);
        session.save(e2);           
        ts.commit();
    } catch (Exception e) {
        e.printStackTrace();
        if(ts!=null){
            ts.rollback();
        }
        // TODO: handle exception
    }finally{
        if(session!=null&&session.isOpen()){
            session.close();
        }
    }
}

简述: 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询.这种现象我们称为 lazy现象 .
解决方法可以这样:
显示初始化 Hibernate.initized(代理对象)
修改对象关系文件 lazy  改写 lazy=false
通过过滤器(web项目) openSessionInView
 
双向一对多(Department-Employee)
Department映射文件添加
<set name=”集合对象属性名”>
    <key column=”外键名”/>
    <one-to-many class=”集合放入的类名”/>
</set>
class Department{
private Integer id;
private String name;
private Set<Employee> emps
}

一对一(Person - IdCard)
1)基于主键的one-to-one(IdCard的映射文件)
<id name=”id”>
    <generator class=”foreign ”><param name=”property”>person</param></generator>
<id>
<one-to-one name=” person” constrained=”true”/>
[没有constraned true将不会生成外键约束]
Person映射文件: <one-to-one name=“idCard” />
class Person{
private Integer id;
private String name;
private IdCard idCard
}
class IdCard{
private Integer id;
private java.util.Date useful_life;
private Person person
}
**添加案例***
session =HibernateUtil.getThreadLocalSession();
ts=session.beginTransaction();
//添加一个Person Idcard
Person p1=new Person();p1.setName("孙悟空");
IdCard id1=new IdCard();
id1.setUseful_time(new java.util.Date());           
//这句话就可以表示id1是p1这个人.
id1.setPerson(p1);
session.save(p1);//insert
session.save(id1);//insert

2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束,
IdCard的映射文件 中:
<many-to-one name=”person” column=”person_id” unique=”true” not-null=”true”/>
<!-唯一的多对一,其实就便成了一对一了就会在Idcard表生成外键-->
class Person{
private Integer id;
private String name;
private IdCard idCard;
}
class IdCard{
private Integer id;
private Date validate,
private Person person;
}

多对多(student - course)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
public class Student {
    private Integer id;
    private String name;
    private Set<StuCourse> stuCourses;
}
public class StuCourse {
    private Integer id;
    private Student student;
    private Course course;
    private Integer grade;
}
public class Course {
    private Integer id;
    private String name;
    private Set<StuCourse> stuCourses;
}

<class name="Student">
<id name="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">stu_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64"/>
</property>
<!-- 这里我们配置了one-to-many 一个学生可以对应多个选课记录 -->
<set name="stuCourses">
<key column="student_id"/>
<one-to-many class="StuCourse"/>
</set>
</class>

<class name="StuCourse" >
<id name="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">stucourse_seq</param>
</generator>
</id>
<property name="grade" type="java.lang.Integer">
<column name="grade" length="3"/>
</property>
<many-to-one name="course" column="course_id"/>
<many-to-one name="student" column="student_id"/>

</class>

<class name="Course">
<id name="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">course_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64"/>
</property>
<!-- 配置one-to-many 表示一门课程可以对应多个选课记录 -->
<set name="stuCourses">
<key column="course_id"/>
<one-to-many class="StuCourse"/>
</set>
</class>

分享到:
评论

相关推荐

    Hibernate对象对应关系总结

    本文主要介绍了对象之间的对应关系,包含对象之间一对一,一对多双向,多对多的关系,另外简单介绍了二级缓存和分页

    hibernate对象三种状态

    在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...

    hibernate中的对象关系模型

    - **双向关联**(标准关联):两个实体对象之间相互引用,如同远房亲戚互相认识。在Java代码中,这通常通过在两个类中设置相互的引用属性来实现,如`Wo`和`MeiNv`的例子。 - **单向关联**:仅有一方对象持有另一方...

    Hibernate映射解析 七种映射关系

    在一对一关系中,两个对象之间存在一对一的对应关系,如Person与IdCard。实现方式有两种: 1. 主键关联:两个对象共享相同的主键,表明它们一对一对应。例如,Person类和IdCard类都使用同一个id作为主键,这表明每...

    Hibernate对象关系详解

    **Hibernate对象关系详解** 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,使得开发者可以方便地在Java对象与数据库表之间进行数据操作。本篇将深入探讨Hibernate中的对象关系映射,包括一对一...

    hibernate对象关系映射实例

    “对应关系有一对一,多对一,多对多”则提示我们将深入学习这三种常见的数据库关联关系在Hibernate中的实现方式。 **Hibernate ORM详解** Hibernate是Java平台上的一个开源ORM框架,它通过提供数据持久化服务,...

    hibernate组件之间的关联

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用 Java 对象来操作数据库,而无需直接编写 SQL 查询。在 Hibernate 中,组件之间的关联是实现对象模型与数据库表之间映射的关键部分,它包括了一对...

    hibernate对象关系映射案例demo

    **hibernate对象关系映射案例demo** 在Java开发领域,对象关系映射(ORM)是一种将数据库中的数据与程序中的对象进行关联的技术,它极大地简化了数据操作。Hibernate作为一款流行的ORM框架,使得开发者无需关注底层...

    Hibernate 操纵持久化对象

    在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本篇将详细讲解如何使用Hibernate来操纵持久化对象,这对于深入理解Hibernate的核心概念至关重要。 **一、...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    以上就是关于Hibernate对象三状态以及OneToOne、OneToMany和ManyToMany关系映射的详细讲解,希望对你理解Hibernate的工作原理和实践有所帮助。在实际开发中,根据业务需求灵活运用这些关系映射,能够有效地管理和...

    Java 精通Hibernate对象持久化技术权威指南

    《Java精通Hibernate对象持久化技术权威指南》是一本深度探讨Java开发中如何高效地使用Hibernate进行对象持久化的专业书籍。本书旨在帮助Java开发者熟练掌握Hibernate框架,实现数据库操作的简化和自动化,提升软件...

    Hibernate 对象持久化

    Hibernate作为一种强大的ORM(对象关系映射)框架,极大地简化了Java应用与数据库之间的交互。它通过将Java类映射到数据库表,实现了对象持久化,使得开发者可以像操作普通Java对象一样处理数据库中的数据,从而降低...

    Hibernate三种状态

    Hibernate对象有三种状态:瞬时状态(Transient)、持久状态(Persistent)和脱管状态(Detached)。理解这些状态对于优化数据操作和避免潜在的问题至关重要。 首先,瞬时状态(Transient)是指通过new关键字创建的...

    精通Hibernate:Java对象持久化技术详解

    6. **实体生命周期管理**:Hibernate自动管理对象的状态,包括瞬态、持久化、托管和脱管四种状态,以及它们之间的转换。 7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、...

    Hibernate ORM 对象关联关系映射初解

    NULL 博文链接:https://dreamzhong.iteye.com/blog/1205496

    精通Hibernate:Java对象持久化技术详解.pdf

    首先,Hibernate的核心概念是对象关系映射(ORM),它通过在Java对象和数据库记录之间建立映射关系,实现了数据的透明访问。ORM解决了传统的JDBC编程模式中数据访问的繁琐性,提高了开发效率。在Hibernate中,实体类...

    Hibernate教程20_关系映射案例三

    【标题】"Hibernate教程20_关系映射案例三"主要涵盖了在Hibernate框架中如何进行对象关系映射(ORM)的实践,特别是针对复杂关系的处理。在这个教程中,我们可能会学习到以下关键知识点: 1. **关系映射**:...

    Hibernate完整使用教程

    Hibernate 是一种流行的开源持久层框架,允许开发者使用面向对象编程语言来访问关系数据库。下面是关于 Hibernate 的详细知识点: Hibernate 介绍 Hibernate 是一个开源的持久层框架,它提供了一个抽象层来访问...

    hibernate的多种映射关系

    在 Hibernate 中,映射关系是将数据库表与 Java 类之间的关联方式,使得对象模型可以与关系模型无缝对接。本篇文章将详细探讨 Hibernate 中的多种映射关系。 1. **一对一映射 (One-to-One)** 一对一映射表示两个...

    hibernate对应关系详解

    本文将深入探讨Hibernate中的九种对象关系映射策略,并结合数据库表结构设计进行详细解析。 1. **一对一(One-to-One)**:在数据库中,两个实体之间可能存在一对一的关系,比如一个人只有一个身份证。在Hibernate...

Global site tag (gtag.js) - Google Analytics