一对一关联有两种实现方式:一种是共享的主键关联,另一种是一对一的外键关联

1、共享的主键关联:让两个对象具有共同的主键值,以表明他们之间的一一对应关系。

Person.java类

 public class Person implements java.io.Serializable {

     // Fields

     private Integer id;
private String name;
private Idcard idcard; // Constructors /** default constructor */
public Person() {
} /** full constructor */
public Person(String name) {
this.name = name;
} // Property accessors public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
public Idcard getIdcard() {
return idcard;
} public void setIdcard(Idcard idcard) {
this.idcard = idcard;
}
}

Idcard.java类

 public class Idcard implements java.io.Serializable {

     // Fields

     private Integer id;
private String idcardno;
private Person person; // Constructors /** default constructor */
public Idcard() {
} /** full constructor */
public Idcard(String idcardno) {
this.idcardno = idcardno;
} // Property accessors public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
} public String getIdcardno() {
return this.idcardno;
} public void setIdcardno(String idcardno) {
this.idcardno = idcardno;
} public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
} }

Person.hbm.xml

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.db.entity.Person" table="person" catalog="mydb">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="30" />
</property>
<one-to-one name="idcard" class="com.db.entity.Idcard" cascade="all" />
</class>
</hibernate-mapping>

Idcard.hbm.xml

 <hibernate-mapping>
<class name="com.db.entity.Idcard" table="idcard" catalog="mydb">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<one-to-one name="person" constrained="true" class="com.db.entity.Person"></one-to-one>
<property name="idcardno" type="java.lang.String">
<column name="idcardno" length="20" />
</property>
</class>
</hibernate-mapping>

bibernate.cfg.xml

 <?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/mydb
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">
MyDBAccount
</property>
<mapping resource="com/db/entity/Idcard.hbm.xml" />
<mapping resource="com/db/entity/Person.hbm.xml" />
</session-factory> </hibernate-configuration>

测试代码:

 public class TestOneOne {

     public static void main(String[] args) {
// TODO Auto-generated method stub Session session=null;
session=HibernateSessionFactory.getSession();
session.beginTransaction();
Idcard idcard=new Idcard();
idcard.setIdcardno("2345678901");
Person person=new Person();
person.setName("Lily");
person.setIdcard(idcard);
idcard.setPerson(person);
session.save(person);
session.save(idcard);
session.getTransaction().commit(); } }

2、一对一的外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。

首先在表idcard中新添加一列pid用于共享数据

Person.java类

 public class Person implements java.io.Serializable {

     // Fields

     private Integer pid;
private String name;
private Idcard idcard; // Constructors /** default constructor */
public Person() {
} /** full constructor */
public Person(String name) {
this.name = name;
} // Property accessors public Integer getPid() {
return this.pid;
} public void setPid(Integer pid) {
this.pid = pid;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
public Idcard getIdcard() {
return idcard;
} public void setIdcard(Idcard idcard) {
this.idcard = idcard;
}
}

idcard.java类

 public class Idcard implements java.io.Serializable {

     // Fields

     private Integer iid;
private String idcardno;
private Person person; // Constructors /** default constructor */
public Idcard() {
} /** full constructor */
public Idcard(String idcardno) {
this.idcardno = idcardno;
} // Property accessors public Integer getIid() {
return this.iid;
} public void setIid(Integer iid) {
this.iid = iid;
} public String getIdcardno() {
return this.idcardno;
} public void setIdcardno(String idcardno) {
this.idcardno = idcardno;
} public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
} }

Person.hbm.xml

 <hibernate-mapping>
<class name="com.db.entity.Person" table="person" catalog="mydb">
<id name="pid" type="java.lang.Integer">
<column name="pid" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="30" />
</property>
<one-to-one name="idcard" class="com.db.entity.Idcard" property-ref="person"></one-to-one>
</class>
</hibernate-mapping>

Idcard.hbm.xml

 <hibernate-mapping>
<class name="com.db.entity.Idcard" table="idcard" catalog="mydb">
<id name="iid" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<many-to-one name="person" column="pid" class="com.db.entity.Person"
cascade="save-update" unique="true"></many-to-one>
<property name="idcardno" type="java.lang.String">
<column name="idcardno" length="20" />
</property>
</class>
</hibernate-mapping>

bibernate.cfg.xml文件和测试代码同上。

如果使用注解映射外键,则注解如下:

Idcard.java类

 public class Idcard implements java.io.Serializable {

     // Fields
private Person person; @OneToOne
@JoinColumn(name="pid")
public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
} }

Person.java类

 public class Person implements java.io.Serializable {

     // Fields
private Idcard idcard; @OneToOne(mappedBy="person")
public Idcard getIdcard() {
return idcard;
} public void setIdcard(Idcard idcard) {
this.idcard = idcard;
}
}

JPA关系映射之one-to-one的更多相关文章

  1. JPA关系映射之many-to-many

    @ManyToMany Board表实体类 @Entity @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Table(nam ...

  2. Spring Data JPA 关系映射(一对一,一对多,多对多 )

    CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除.CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地 ...

  3. JPA关系映射之one-to-many和many-to-one

    one-to-many(一对多)和many-to-one(多对一)双向关联 假设部门与员工是一对多关系,反过来员工与部门就是多对一关系. Dept.java类 public class Dept im ...

  4. [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  5. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  6. JPA总结——实体关系映射(一对多@OneToMany)

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

  7. JPA 对象关系映射之关联关系映射策略

    关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...

  8. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  9. Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

随机推荐

  1. js基础(一)

    javascript基本介绍(一) (后面我会持续写关于关于js的知识,里面写了很多js的小细节大家可以看下希望对大家有帮助,同时希望大家如果感觉有帮助的话可以帮忙顶一下,谢谢了) Javascrip ...

  2. 使用angular4搭建博客(一)

    本文长期更新,未经运行,严禁转载. 博客(制作中) http://101.200.58.228/ Github https://github.com/Teloi/TEIndex 框架选择 Angula ...

  3. [原创]在HP DL380 G7服务器上部署基于Ubuntu Server 16.04 和 VirtualBox的云平台

    对于一线开发人员来说,一提到虚拟机平台,往往会让人联想到在价格昂贵的服务器上部署VMware vSphere之类软件来实现. 笔者作为一个资深码农,也是一直梦寐着在自己家中打造一个真正的家庭私有云,秒 ...

  4. 请求Url返回数据较大,使结果分页获取

    首先创建了一个单元测试,如下项目视图: 分页结果映射类PageResult的编写: using System; using System.Collections.Generic; using Syst ...

  5. 关于transient和static的序列化和反序列化

    做java开发有段时间了,最近没那么忙了,抽了点时间看了下java的源码 . 在读源码的时候看到了一个 transient 修饰的变量 ,字面意思是瞬变的.在以前的开发过程中也没用到过这个修饰语,查了 ...

  6. WEB前端规范命名

    头部 header ----------------用于头部 主要内容 main ------------用于主体内容(中部) 左侧 main-left -------------左侧布局 右侧 ma ...

  7. 【渗透课程】第五篇-SQL注入的原理

    哈哈哈,讲到注入了.我想给大家讲注入的原理.这个我们前面的前言篇就说过,所谓的SQL注入就是,绕过数据库验证机制直接执行SQL语句.怎么说呢,我们先讲一个概念吧! 网站和网页的区别 单纯的网页是静态的 ...

  8. jmeter日记

    1.不要像loadrunner一样使用集合点,jmeter不需要 2.性能测试 线程组设置的时候 永远 3.启动jmeter之后,打开log 4.分布式的话 tps是多台电脑的tps之和 自动加好了的 ...

  9. Keepalive之nginx调度架构

    author:JevonWei 版权声明:原创作品 单主模式Keepalive之Nginx调度 实验目的:实现Nginx调度的高可用,当一台Nginx调度器故障时,启用备用的Nginx调度,在架构中, ...

  10. 7_SQL Server通过代码删除数据

    --通过代码方式删除数据select *from Employee --第一种删除方式,数据没了,表还在,id接着删除前的id继续加1delete from Employee where EmpId ...