【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联

简介:   接着上篇文章,唯一外键关联,就是给一对一关联关系中某个对象加一个外键。比如这里给t_person表添加一个外键,指向t_idcard的主键,并且规定t_person中的外键idCard唯一,也可以达到一对一映射的效果。

  接着上篇文章,唯一外键关联,就是给一对一关联关系中某个对象加一个外键。比如这里给t_person表添加一个外键,指向t_idcard的主键,并且规定t_person中的外键idCard唯一,也可以达到一对一映射的效果。


46.png


一对一单向关联映射




  Po对象:

  IdCard .java

public class IdCard {
    private int id;
    private String cardNo;  
    //getter、setter
}


  Person.java

public class Person {
    private int id;
    private String name;
    private IdCard idCard;
    //getter、setter
}


  映射文件:

  IdCard.hbm.xml


<hibernate-mapping package="org.hibernate.test" >
    <class name="com.danny.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="cardNo"/>
    </class>
</hibernate-mapping>


  Person.hbm.xml

<hibernate-mapping package="org.hibernate.test" >
    <class name="com.danny.hibernate.Person" table="t_person">
        <id name="id" type="int">
            <generator class="native">
            </generator>
        </id>
        <property name="name"/>
        <many-to-one name="idCard"  unique="true"/>     
    </class>
</hibernate-mapping>


 与上篇文章中主键关联不同的是,t_person的主键生成策略为 native ,不再以外键形式关联到t_idcard的主键了,而是用<many-to-one>标签重新与t_idcard建立了多对一的关系,这样就会在t_person表中生成一个外键关联到t_idcard的主键,并且unique="true"会对此外键生成唯一约束


 建表时生成的sql语句为:


drop table if exists t_idCard
drop table if exists t_person
create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
create table t_person (id integer not null auto_increment, name varchar(255), idCard integer unique, primary key (id))
alter table t_person add index FK785BED80F7C7B4CE (idCard), add constraint FK785BED80F7C7B4CE foreign key (idCard) references t_idCard (id)


  至此,唯一外键关联就已经配好了,下面进行测试。


  插入测试


session.beginTransaction();     
IdCard idCard=new IdCard();
idCard.setCardNo("123456789");
session.save(idCard);           
Person person=new Person();
person.setName("danny");
person.setIdCard(idCard);           
session.save(person);
session.getTransaction().commit();


 由于t_person生成策略为native,跟t_idcard无关,所以在第四行代码中先执行了session.save(idCard),目的是把idCard变为变为transient状态,否则在清理脏数据时会报错:“org.hibernate.TransientObjectException: object references an unsaved transient instance”


 插入的数据如下:


477.png


  插入时执行的sql语句:

insert into t_idCard (cardNo) values (?)
insert into t_person (name, idCard) values (?, ?)



  查询测试


Person person=(Person)session.load(Person.class, 1);
System.out.println("person的name:"+person.getName());
System.out.println("person的cardNo:"+person.getIdCard().getCardNo());


 实际执行sql语句:


select person0_.id as id0_0_, person0_.name as name0_0_, person0_.idCard as idCard0_0_ from t_person person0_ where person0_.id=?
select idcard0_.id as id1_0_, idcard0_.cardNo as cardNo1_0_ from t_idCard idcard0_ where idcard0_.id=?

  执行结果


person的name:danny
person的cardNo:123456789


一对一双向关联映射


 双向关联和上一篇文章道理一样,也很简单,Person.java和Person.hbm.xml都不用改动,在IdCard中添加一个person属性,配置文件中与t_person的关系为one-to-one。


 Po对象:


 IdCard .java


public class IdCard {
    private int id;
    private String cardNo;  
    private Person person;
    //getter、setter
}


  映射文件:

  IdCard.hbm.xml


<hibernate-mapping package="org.hibernate.test" >
    <class name="com.danny.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="cardNo"/>
        <one-to-one name="person" property-ref="idCard"/>
    </class>
</hibernate-mapping>


 因为这里配置的实质是一张身份证只对应一位公民,所以用<one-to-one>标签,property-ref="idCard"指t_idcard的主键与t_person中的idCard字段对应。


 唯一外键关联较主键关联映射的好处就是,万一哪天需求变了,这两个对象的关系由一对一变为多对一,那么直接把外键唯一的约束去掉就行。


 而且唯一外键关联其实就是多对一关联的一种特殊情况,下面将会介绍多对一关联的情况。

相关文章
|
7月前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——DeptDaoImpl.java
ssh(Spring+Spring mvc+hibernate)——DeptDaoImpl.java
|
7月前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——BaseDaoImpl.java
ssh(Spring+Spring mvc+hibernate)——BaseDaoImpl.java
|
3月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
65 4
|
4月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
125 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
4月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
92 0
|
4月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
56 0
|
7月前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——Dept.java
ssh(Spring+Spring mvc+hibernate)——Dept.java
|
7月前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——showDept.jsp
ssh(Spring+Spring mvc+hibernate)——showDept.jsp
|
7月前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——applicationContext.xml
ssh(Spring+Spring mvc+hibernate)——applicationContext.xml
|
7月前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——EmpController
ssh(Spring+Spring mvc+hibernate)——EmpController