`
wx1568844008
  • 浏览: 5408 次
文章分类
社区版块
存档分类
最新评论

Hibernate 关系映射、多向关联

 
阅读更多

新建部门类

         private int deptId;

         private String deptName;  

         private Set emps = new HashSet();          //部门包含员工集合

新建员工类

         private int empId;

         private String empName;

         private int empAge;

         private Dept dept; //部门对象                

新建Dept.hbm.xml

      <class name="com.tfsoft.two.Dept">

         <id name="deptId">

           <generator></generator>

         </id>

         <property name="deptName" length="10"></property>

        

         <!-- 一对多 -->

         <set name="emps" inverse="true"><!-- 集合中使用,表示由对方维护主外键关系 -->

           <key column="deptFk" not-null="true"></key>

           <one-to-many class="com.tfsoft.two.Employee"/>

         </set>

</class>

 

inverse=“false”是默认的值。

inverse只对集合起作用,也就是只对one-to-manymany-to-many有效(因 为只有这两种关联关系包含集合,而one-to-onemany-to-one只含有关系对方的一个引用)。

<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many>
中,只设置其中一方inverse=”false”,或双方都不设置

 

新建Employee.hbm.xml

      <class name="com.tfsoft.two.Employee">

         <id name="empId">

           <generator></generator>

         </id>

         <property name="empName" length="10"></property>

         <property name="empAge"></property>

        

         <!-- 多对一 -->

         <!-- cascade默认属性,unsaved-value默认为Null -->

         <many-to-one name="dept" class="com.tfsoft.two.Dept" lazy="false">

            <column name="deptFk" not-null="true"></column><!-- 映射到数据库中的名称和设置 -->

         </many-to-one>

      </class>

新建测试类

public class Two {

         private static Configuration cf = null;

         private static SessionFactory sf = null;

         static{

                   cf = new Configuration().configure();

                   sf = cf.buildSessionFactory();

         }

        

         //新增部门

         public void saveOrUpdateDept(Dept dept){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(dept);

                   ts.commit();

                   session.close();

         }

        

         //通过部门主键获取对象

         public Dept getDeptById(int deptId){

                   Session session = sf.openSession();

                   Dept dept = (Dept)session.get(Dept.class, deptId);

                   session.close();

                   return dept;

         }

        

        

         //新增员工

         public void saveOrUpdateEmp(Employee emp){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(emp);

                   ts.commit();

                   session.close();

         }

 

         //通过员工主键获取对象

         public Employee getEmpById(int empId){

                   Session session = sf.openSession();

                   Employee emp = (Employee)session.get(Employee.class, empId);

                   session.close();

                   return emp;

         }

        

         public static void main(String[] args) {

                   Two two = new Two();

/*               Dept dept = new Dept();          新增部门

                   dept.setDeptName("人事部");

                   two.saveOrUpdateDept(dept);*/

                  

/*               Employee emp = new Employee();           新增员工,同时获取部门,添加到部门里面

                   emp.setEmpAge(20);

                   emp.setEmpName("张三");

                  

                   Dept dept = two.getDeptById(1);

                   emp.setDept(dept);

                   two.saveOrUpdateEmp(emp);*/

                  

/*               Employee emp = two.getEmpById(1);              通过Id获取员工

                   System.out.println(emp.getEmpId()+"::"+emp.getEmpName());

                   Dept dept = emp.getDept();             获取员工所在的部门

                   System.out.println(dept.getDeptId());

                   System.out.println(dept.getDeptName());*/          lazy="false"时,可以获取部门的名称,为true只能获取id

                  

                   Dept dept = two.getDeptById(1);            通过Id 获取部门

                   System.out.println(dept.getDeptName());

                   Set emps = dept.getEmps();             通过部门查询员工集合

                   Iterator it = emps.iterator();            迭代器循环打印

                   while(it.hasNext()){

                            Employee emp = (Employee)it.next();

                            System.out.println(emp.getEmpName());

                   }

                  

         }

}

一对一

新建身份证类

         private int CarId;

         private String CarNum;

         private Person person;

新建人类

         private int perId;

         private String perName;

新建Card.hbm.xml文件

             <class name="com.hou.onetoone.Card" table="card">

                       <id name="carId" column="carId">

                                <generator></generator>

                       </id>

                       <property name="carNum" column="carNum" type="string" length="18"></property>

                      

                       <one-to-one name="person" class="com.hou.onetoone.Person"

                       constrained="true">         

                       </one-to-one>

             </class>

constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响savedelete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之

one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=truehibernate即会延迟加载sql,只把本表的查出来,等有用到关联表的再发sql取。

one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据。

 

新建Person.hbm.xml文件

             <class name="com.hou.onetoone.Card" table="card">

                       <id name="carId" column="carId">

                                <generator></generator>

                       </id>

                       <property name="carNum" column="carNum" type="string" length="18"></property>

                      

                       <one-to-one name="person" class="com.hou.onetoone.Person"

                       constrained="true">

                       </one-to-one>

             </class>

新建测试类

public class Onetoone {

         private static Configuration cf = null;

         private static SessionFactory sf = null;

         static{

                   cf = new Configuration().configure();

                   sf = cf.buildSessionFactory();

         }

         //新增人

         public void saveOrUpdatePerson(Person per){

                   Session session=sf.openSession();

                   Transaction ts=session.beginTransaction();

                   session.saveOrUpdate(per);

                   ts.commit();

                   session.close();

         }

         //新增身份证

         public void saveOrUpdateCard(Card car){

                   Session session=sf.openSession();

                   Transaction ts=session.beginTransaction();

                   session.saveOrUpdate(car);

                   ts.commit();

                   session.close();

         }

//通过Id获取人

         public Person getPerById(int perId){

                   Session session=sf.openSession();

                   Transaction ts=session.beginTransaction();

                   Person per=(Person)session.get(Person.class, perId);

                   ts.commit();

                   session.close();

                   return per;

//通过Id获取身份证

         }public Card getCarById(int CarId){

                   Session session=sf.openSession();

                   Transaction ts=session.beginTransaction();

                   Card car=(Card)session.get(Card.class, CarId);

                   ts.commit();

                   session.close();

                   return car;

         }

         public static void main(String[] args) {

                   Onetoone oto=new Onetoone();

                   Person per=new Person();/*            新增人

                   per.setPerName("侯强强");

                   oto.saveOrUpdatePerson(per);*/

/*               Card car=new Card();                获取人添加进身份证

                   car.setCarNum("12345678912");

                   car.setPerson(oto.getPerById(1));

                   oto.saveOrUpdateCard(car);*/

 

/*               Card car=oto.getCarById(1);            获取Id

                   car.setCarNum("111");                     修改身份证号码

                   car.setCarId(1);                                   

                   oto.saveOrUpdateCard(car);*/

 

                   Card car=oto.getCarById(1);            通过Id 获取对象

                   System.out.println(car.getPerson().getPerName());                打印身份证对应的人的姓名,添加lazy=”false”

                                                                                                                                   Constrained=”false”时,数据库外键不显示,查询时通过左连接查询出姓名

         }

}


转载于:https://my.oschina.net/u/2353689/blog/476079

分享到:
评论

相关推荐

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate集合映射与关联关系

    本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合关系"、"student与class的多对一"以及"一对多映射"的概念。 首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    Hibernate关联映射总结

    在这种映射关系中,我们只在一端维护关联关系。比如,在`Person`类中添加`IdCard`对象的引用,但`IdCard`类不持有`Person`对象的引用。这意味着我们只能从`Person`对象访问到对应的`IdCard`信息,而不能反向操作。...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    Hibernate的关联关系映射图解

    Hibernate4中映射关系图解。

    Hibernate 关联关系映射分类

    综上所述,Hibernate提供了丰富的关联关系映射机制,包括一对一、一对多和多对多关联,每种关联又可以细分为单向和双向,以及基于主键和基于外键的不同实现方式。正确理解和选择合适的关联关系对于构建高效、可维护...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate实体关联关系映射

    本文旨在深入探讨Hibernate中的实体关联关系映射技术,主要包括一对一、一对多、多对多等不同类型的关联关系及其在实际开发中的应用技巧。通过本文的学习,开发者可以更好地理解和掌握Hibernate框架下的实体关联关系...

    Hibernate关系映射

    "多对一"关系映射是Hibernate支持的四种基本关联类型之一,包括一对一、一对多、多对一和多对多。本篇将深入探讨“多对一”关系映射的概念、配置以及在实际web系统中的应用。 **一、“多对一”关系映射概念** 在...

    Hibernate_关联关系映射配置详解

    Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者

    hibernate关联映射的作用和常用属性解释

    其中,“关联映射”是Hibernate中的一个重要概念,用于处理实体之间的关联关系,例如一对一、一对多、多对一以及多对多等。 #### 常用属性解析 为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解...

    Hibernate一对一主键关联映射(双向关联)

    然而,需要注意的是,由于这种关联是双向的,所以在处理关联关系时,要特别注意同步两个方向的引用,避免出现数据不一致的情况。 在实际开发中,我们可能还会遇到一些问题,比如懒加载(Lazy Loading)、EAGER加载...

    Hibernate关联映射

    5. Hibernate 一对多连接表单向关联: 类似于一对一的连接表关联,这里也是通过额外的连接表实现一对多关系。连接表会包含两个外键,一个指向父实体,另一个指向子实体。映射配置中,需要创建连接表实体,并使用 `...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    hibernate一对多关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对多关联映射是一种常见的关系映射方式,它用于表示一个实体(如用户)可以拥有多个关联实体(如订单)。在这个场景中,"一"通常代表父实体,"多"代表子实体。这篇博客文章...

    hibernate关系映射多对多关系

    本资料包主要关注的是Hibernate中的关系映射,特别是多对多(ManyToMany)关系,这对于理解和实现复杂的数据库模型至关重要。在Spring+Hibernate+Struts框架下,这种映射关系的应用更是常见。 首先,我们需要了解在...

    hibernate关联关系映射

    "hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何在Java对象和数据库表之间建立关系。以下是对这个主题的详细讲解: 一、一对一关系映射(One-to-One) 一对一关系是指一个实体对应另一个实体的...

Global site tag (gtag.js) - Google Analytics