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

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. sublime text 的小细节设置,让你的代码更优美

    这些属性都可以在 首选项>设置-默认 里修改下面也会介绍几个比较常用的几个插件 字体大小: "font_size": 17 高亮编辑中的一行 "highlight_ ...

  2. 使用jquery.PrintArea.js打印网页的样式问题

    在使用jquery.PrintArea.js打印局部网页样式的时候,发现样式打印不出来,在网上找了好多资料,整理一下分享给大家 一.先看看css的引用文件方式 1.直接在内部的元素中使用”style” ...

  3. Linux之旅-ubuntu下搭建nodejs环境

    .NET Core也开源了,并且可移植到Linux下,而ubuntu作为linux发行版的翘楚,极大的方便了初学者的入门,搭建完ASP.NET Core运行环境后,作为半前半后的开发人员,就继续着搭建 ...

  4. 微信小程序源码推荐

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  5. 【SVN】手动删除svn元信息

    工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...

  6. MAVEN 编译打包时报“.....找不到符号” 的处理方法总结

    这个错都是在MAVEN插件在编译的时候报的,所以问题一定是出在编译的环节上. 这个时候就要好好检查MAVEN的编译配置, 1.看看配置里的编译版本和本机环境上配置的java版本是否一致,有时候报错的类 ...

  7. shell之 printf 输出语句

    总结: (1)printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认printf不会像 echo 自动添加换行符,我们可以手 ...

  8. AOP入门之静态代理

    代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及 ...

  9. C# 异步编程2 EAP 异步程序开发

    在前面一篇博文记录了C# APM异步编程的知识,今天再来分享一下EAP(基于事件的异步编程模式)异步编程的知识.后面会继续奉上TPL任务并行库的知识,喜欢的朋友请持续关注哦. EAP异步编程算是C#对 ...

  10. Spring Boot-------项目搭建及注解

    Spring Boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需 ...