OneToOne 单向(随便在那一方加关联)
实体类:
Person.java
public class Person { private int id; private String name; private IDCard idcard; 省略get,set }
IDCard.java
public class IDCard { private int id; private String no; 省略get,set }
hbm文件
person.hbm.xml
<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>
IDCard.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> <!-- oneToOne和oneToMany类似,只需要加一个unique="true" 表示一一对应 --> <many-to-one name="person" column="pid" unique="true"></many-to-one> </class> </hibernate-mapping>
OneToOne 双向关联(与上面的区别在于)
public class IDCard { private int id; private String no; private Person person;//加一个person属性 省略get,set }
<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>
测试方法:
@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); //此时的person已经对应了idcard 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 testAdd03() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); /* * 此时,由于使用的是IDCard来维护关系(外键在哪一端就由哪一段来维护) * 通过p.setIdCard就无效,所以关系不会更新 */ IDCard id = new IDCard(); id.setNo("123"); session.save(id); Person p = new Person(); p.setName("zzz"); p.setIdcard(id); session.save(p); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { 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会自动完成join,仅仅只会发一条sql,如果使用维护关系端取数据,在通过延迟加载取关联对象时 * 会同时再去取person的idCard关联,所以会发3条 */
相关推荐
- `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 描述实体间的一对多、多对一、一对一和多对多关系。 - `@JoinColumn`: 在关联关系中定义外键列。 - `@Temporal`: 用于日期和时间类型的字段,指定其...
在这个“Hibernate双向一对一关联映射(XML版)”的主题中,我们将深入探讨如何通过XML配置文件实现两个实体之间的一对一关系。 首先,我们需要理解一对一关联的概念。在数据库中,一对一关联意味着两个表中的每一...
具体到这个"SSH整合架包jar",它可能包含了这三个框架的库文件,以及一些整合所需的配置文件,比如struts.xml、hibernate.cfg.xml和spring-context.xml。开发者在项目中引入这个jar包,就可以快速搭建一个支持SSH...
在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...
hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档
本文将结合"hibernate源码"和"hibernate配置"两个核心主题,深入探讨Hibernate的工作原理及配置细节,帮助读者从源码层面提升对Hibernate的理解。 一、Hibernate源码解析 1. 框架结构:Hibernate由多个模块组成,...
在这个DEMO中,Spring2.5.6采用了Annotation注解的方式,使得代码更加简洁,无需XML配置文件,只需在类或方法上添加注解,就可以声明bean和其依赖。Spring还提供了事务管理、AOP(面向切面编程)等功能,增强了应用...
描述中的“Hiberante3_HQL”提示我们将会涉及到Hibernate查询语言(HQL),它是面向对象的查询语言,允许开发者以类和对象的方式查询数据库。 “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过...
1. **双向关联**:如示例所示,`Person`和`IdCard`可以互相引用,形成双向关联。但并不是必须的,也可以只在单向进行映射。 2. **外键约束**:默认情况下,Hibernate会在被引用方(通常是拥有`mappedBy`的那一方)...
在 XML 配置文件中,我们可以声明 Spring MVC 的 DispatcherServlet,它是整个 Web 应用的入口点,负责接收请求并分发到相应的处理器。同时,我们还需要配置 ViewResolver,它解析视图,例如 JSP 页面。 接下来,...
最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....
本篇将深入探讨Hibernate3.jar及其API,帮助开发者更好地理解和运用这个库。 一、Hibernate3.jar介绍 Hibernate3.jar是Hibernate ORM框架的第三个主要版本,它提供了丰富的功能,包括对象持久化、查询语言(HQL)...
DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问,通常与ORM框架如Hibernate一起使用,以隔离业务逻辑和数据存储之间的交互。 在给定的代码片段中,`HibernateDAO` 类是用来封装...
**六、查询语言HQL** Hibernate Query Language (HQL) 是一种面向对象的查询语言,允许开发者用Java类和属性来编写查询,而不是直接使用SQL。例如,查询所有用户: ```java Session session = sessionFactory....
Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分
Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...
9. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多等各种关联映射,如`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`,使得对象之间的关系能自然地体现在数据库设计中。 10. **懒加载和...
在这个项目中,它可能包含了预先创建的表结构,用于存储分类信息,比如一级分类、二级分类和三级分类的关联数据。 项目提供的JAR包可能包含了Struts2、Hibernate以及其他依赖库的jar文件,这些是运行项目所必需的。...
开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root