(1) 单向关联
实体类:Person.java IDCard.java
public class IDCard { private int id; private String no; private Person person; 省略get,set } public class Person { private int id; private String name; 省略get,set }
IDCard.hbm.xml,Person.hbm.xml
<hibernate-mapping package="org.th.model"> <class name="IDCard" table="t_idcard" > <id name="id"> <generator class="native"></generator> </id> <property name="no"></property> <many-to-one name="person" column="pid" unique="true"></many-to-one> </class> </hibernate-mapping> <hibernate-mapping package="org.th.model"> <class name="Person" table="t_person" > <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
(2) 双向关联
public class IDCard { private int id; private String no; private Person person; 省略get,set } public class Person { private int id; private String name; private IDCard idcard;//相对单向加一个属性 省略get,set }
IDCard.hbm.xml,Person.hbm.xml
<hibernate-mapping package="org.th.model"> <class name="IDCard" table="t_idcard" > <id name="id"> <generator class="native"></generator> </id> <property name="no"></property> <many-to-one name="person" column="pid" unique="true"></many-to-one> </class> </hibernate-mapping> <hibernate-mapping package="org.th.model"> <class name="Person" table="t_person" > <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!--name是属性名称,property-ref表示由对方的属性来维护关系,当然配置文件反过来写 也是可以的 --> <one-to-one name="idcard" property-ref="person" ></one-to-one> </class> </hibernate-mapping>
测试类 TestOneToOne.java :
public class TestOneToOne { @Test public void testAdd01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Person person = new Person(); person.setName("老张"); session.save(person); IDCard idcard = new IDCard(); idcard.setNo("999"); idcard.setPerson(person); session.save(idcard); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } @Test public void testAdd02() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Person person = (Person) session.load(Person.class, 1); // ConstraintViolationException: Duplicate entry '1' for key 2 // Many-to-one 当使用了unique=true,就会保证每一个person只能对应一个idcard IDCard idcard = new IDCard(); idcard.setNo("111"); idcard.setPerson(person); session.save(idcard); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } /** * * @Title: testAdd03 * @Description: oneToOne 双向关联 * @param * @return void 返回类型 * @throws */ @Test public void testAdd03() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { if (session != null) HibernateUtil.close(session); } } @Test public void testAdd04() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Person p = new Person(); p.setName("zzzzz"); session.save(p); IDCard id = new IDCard(); id.setNo("12322"); id.setPerson(p); session.save(id); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testLoad01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Person p = (Person) session.load(Person.class, 4); // 只要取出的是没有维护关系的这一方,会自动将关联对象取出,会发出1条sql // 由于person端没有维护关系,所以不会进行延迟加载,所以1条就搞定了 System.out.println(p.getName() + "," + p.getIdcard().getNo()); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testLoad02() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); // 特别注意:如果没有双向,此时会发出2条,一条去idCard,一条延迟加载取person // 此时会发出三条SQL语句 IDCard id = (IDCard) session.load(IDCard.class, 4); // 此时没有使用idCard的Person,会延迟加载,目前只是发出1条SQL System.out.println(id.getNo()); // 要去取person同时也会取出这个person的idCard,这里就不会使用join来取出,所以会发出2条sql System.out.println(id.getPerson().getName()); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if (session != null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } /** * 最佳实践就是,One2One的时候最好不要使用双向关联,如果使用双向关联,尽可能在没有维护关系的一边取数据 * hibernate会自动完成joine,仅仅只会发一条sql,如果使用维护关系端取数据,在通过延迟加载取关联对象时 * 会同时再去取person的idCard关联,所以会发3条 */
相关推荐
本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...
在Hibernate中,一对一关系有多种实现方式,包括单向和双向关联,以及外键在主表还是从表等不同形式。 **压缩包子文件的文件名称列表:s2sh_relation01_one2one_uni_fk** 这个文件名暗示了这是一组基于Spring、...
这个文件名可能代表了一个基于Struts2、Spring和Hibernate(S2SH)的项目,其中"relation03"可能表示关系映射的第三部分,而"one2one_uni_pk"直指一对一单向主键关联的具体实现。 **详细知识点:** 1. **一对一...
这种关联关系可以是单向的,也可以是双向的,而这里的"hibernate关联关系之一对一双向关联"着重讨论的是后者。双向关联意味着两个实体类都可以直接访问对方,提供了更方便的数据操作。 在Hibernate中,一对一双向...
在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但...
本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...
本篇文章将深入探讨Hibernate中的一对一外键单向关联。 首先,一对一外键关联指的是一个实体通过外键直接引用另一个实体的主键。在单向关联中,只有其中一个实体知道另一个实体的存在,而另一个实体则无感知。这种...
双向关联需要在双方都进行配置,通常使用`@ManyToOne`和`@OneToOne`注解。 3. **外键管理**:Hibernate支持两种外键管理方式:懒加载和立即加载。懒加载意味着外键值只有在实际访问子对象时才从数据库加载;立即...
本篇将深入探讨Hibernate中的一对一单向外键关联,通过注解和XML配置两种方式进行实现。这种关联允许一个实体类与另一个实体类之间存在一对一的关系,并且只在其中一个实体类中维护这种关系。 首先,我们来理解一对...
在Hibernate中,双向关联可以通过注解或XML配置文件来实现,使得在Java对象层面可以方便地进行双向导航。 1. **单向一对多关联(OneToMany)** 在这个关联中,一个父对象可以有多个子对象,但子对象并不知道父对象...
总的来说,Hibernate的一对一唯一外键关联(单向关联)是通过在一方实体中定义另一方实体的引用,并通过注解或XML映射文件进行配置来实现的。这种关联方式简化了对象关系的管理,但同时也需要开发者在操作关联对象时...
这种映射方式可以分为单向和双向,而这里我们关注的是双向关联,即两个实体都可以直接访问对方。 二、配置方式 1. **配置实体类** 在两个实体类中,我们需要添加对应的属性和getter/setter方法,并在属性上使用`@...
- 如果需要双向关联,即`Person`和`IdCard`都能访问对方,需要在`IdCard`类中添加一个`Person`属性,并使用`@OneToOne(mappedBy = "idCard")`注解。 以上就是关于Hibernate一对一唯一外键关联映射(单向关联)的...
本文将深入探讨Hibernate 3.0中的数据库关联配置,包括注解和XML两种方式。 1. **注解配置** Hibernate注解提供了在实体类上直接声明数据库表映射和关联关系的方法。例如,@Entity表示一个类映射为数据库表,@...
学习和理解这个例子,有助于深入掌握Hibernate中一对一关联映射的原理和实践,特别是双向关联的处理。 总结来说,Hibernate的双向一对一关联映射涉及两个实体类之间的相互引用,需要在每个实体类上使用`@OneToOne`...
1. **一对一关联**:使用`@OneToOne`注解,可以是单向或双向关联,通过`mappedBy`属性指定关联的反向字段。 2. **一对多关联**:使用`@OneToMany`注解,同样可以是单向或双向。双向关联中,一方使用`mappedBy`,另...
根据给定文件的信息,本文将详细介绍Hibernate ORM(Object Relational Mapping)中关于不同类型的关联映射方式,并结合Annotation和XML两种配置方式来进行说明。 ### 一、一对一单向外键关联 在一对一单向外键...
标题 "myeclipse试用小记----Hibernate多对一单向关联(1)" 提到的是在MyEclipse集成开发环境中使用Hibernate框架实现多对一单向关联的实践记录。这个主题涉及到Java后端开发中的数据库关系映射和对象持久化技术。 ...
8. **一对多、一对一、多对多关系映射**:Hibernate支持各种关联关系,包括实体间的单向和双向关联,通过`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`注解进行配置。 9. **级联操作**:通过`...
Hibernate注解是Hibernate框架的一个关键特性,它允许开发者通过在Java类和属性上添加元数据注解,来定义对象与数据库表之间的映射关系,替代了传统的XML配置方式。以下是关于Hibernate注解的一些重要知识点: 1. ...