JPA关系映射之one-to-one
一对一关联有两种实现方式:一种是共享的主键关联,另一种是一对一的外键关联
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的更多相关文章
- JPA关系映射之many-to-many
@ManyToMany Board表实体类 @Entity @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Table(nam ...
- Spring Data JPA 关系映射(一对一,一对多,多对多 )
CascadeType.REMOVE 级联删除操作,删除当前实体时,与它有映射关系的实体也会跟着被删除.CascadeType.MERGE 级联更新(合并)操作,当Student中的数据改变,会相应地 ...
- JPA关系映射之one-to-many和many-to-one
one-to-many(一对多)和many-to-one(多对一)双向关联 假设部门与员工是一对多关系,反过来员工与部门就是多对一关系. Dept.java类 public class Dept im ...
- [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- JPA总结——实体关系映射(一对多@OneToMany)
JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...
- JPA 对象关系映射之关联关系映射策略
关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...
- JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明
JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...
- Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
随机推荐
- sublime text 的小细节设置,让你的代码更优美
这些属性都可以在 首选项>设置-默认 里修改下面也会介绍几个比较常用的几个插件 字体大小: "font_size": 17 高亮编辑中的一行 "highlight_ ...
- 使用jquery.PrintArea.js打印网页的样式问题
在使用jquery.PrintArea.js打印局部网页样式的时候,发现样式打印不出来,在网上找了好多资料,整理一下分享给大家 一.先看看css的引用文件方式 1.直接在内部的元素中使用”style” ...
- Linux之旅-ubuntu下搭建nodejs环境
.NET Core也开源了,并且可移植到Linux下,而ubuntu作为linux发行版的翘楚,极大的方便了初学者的入门,搭建完ASP.NET Core运行环境后,作为半前半后的开发人员,就继续着搭建 ...
- 微信小程序源码推荐
wx-gesture-lock 微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...
- 【SVN】手动删除svn元信息
工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...
- MAVEN 编译打包时报“.....找不到符号” 的处理方法总结
这个错都是在MAVEN插件在编译的时候报的,所以问题一定是出在编译的环节上. 这个时候就要好好检查MAVEN的编译配置, 1.看看配置里的编译版本和本机环境上配置的java版本是否一致,有时候报错的类 ...
- shell之 printf 输出语句
总结: (1)printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认printf不会像 echo 自动添加换行符,我们可以手 ...
- AOP入门之静态代理
代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及 ...
- C# 异步编程2 EAP 异步程序开发
在前面一篇博文记录了C# APM异步编程的知识,今天再来分享一下EAP(基于事件的异步编程模式)异步编程的知识.后面会继续奉上TPL任务并行库的知识,喜欢的朋友请持续关注哦. EAP异步编程算是C#对 ...
- Spring Boot-------项目搭建及注解
Spring Boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需 ...