Hibernate关系映射(二) 基于外键的双向一对一
基于外键的双向一对一关联映射
需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用。
还是通过刚才用户和地址来演示双向一对一关联。
代码演示
一、实体类
Account.cs,需要添加被控端的引用
package com.lxit.entity;
import java.io.Serializable;
public class Account implements Serializable{
public Account(){
}
private int id;
private String name;
private String password;
//需要添加被控端的引用
private Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address.cs,被控端也需要添加主控端的引用
package com.lxit.entity;
import java.io.Serializable;
public class Address implements Serializable{
public Address(){
}
private int id;
private String name;
//双向1对1,被控端也知道主控端的引用
private Account account;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
}
二、映射文件
Account.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lxit.entity.Account" table="Account">
<id column="id" name="id">
<generator class="native"/>
</id>
<property column="name" generated="never" lazy="false" name="name"/>
<property column="password" generated="never" lazy="false" name="password"/>
<!-- 通过many-to-one 标签添加唯一属性约束,建立一对一关联关系 -->
<many-to-one column="address_id" name="address" unique="true"/>
<!-- 必须通过映射关系生成的表才会生成唯一约束,否则不会生成 -->
</class>
</hibernate-mapping>
Address.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lxit.entity.Address" table="Address">
<id column="id" name="id">
<generator class="native"/>
</id>
<property column="name" generated="never" lazy="false" name="name"/> <!-- one-to-one 映射一对一关联,name对应当前类的引用属性,property-ref属性:指定account类的属性引用 -->
<one-to-one name="account" property-ref="address"></one-to-one>
</class>
</hibernate-mapping>
jUtilTest
package com.lxit.demo2.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test; import com.lxit.entity.Account;
import com.lxit.entity.Address;
import com.lxit.util.HibernateUtil; public class AccountTest { @Test
public void createTable(){
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
se.create(true, true);
} @Test
public void Add(){
Transaction tx = null;
Session session = HibernateUtil.getSession();
tx = session.beginTransaction(); Address address= new Address();
address.setName("深圳宝安");
session.save(address); Account account = new Account();
account.setName("zhangsan");
account.setPassword("123");
account.setAddress(address); try {
session.save(account);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.CloseSession(session);
} } @Test
public void Add2(){
Transaction tx = null;
Session session = HibernateUtil.getSession();
tx = session.beginTransaction(); Address address= new Address();
address.setName("深圳福田");
session.save(address); Account account1 = new Account();
account1.setName("lisi");
account1.setPassword("123");
account1.setAddress(address); Account account2 = new Account();
account2.setName("wangwu");
account2.setPassword("123");
account2.setAddress(address); try {
//重复添加第二个用户,地址相同,则会报错
session.save(account1);
session.save(account2);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.CloseSession(session);
} }
}
Hibernate关系映射(二) 基于外键的双向一对一的更多相关文章
- Hibernate 基于外键的双向一对一关联映射
之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...
- java之hibernate之基于外键的双向一对一关联映射
这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- hibernate 关系映射之 单向外键关联一对一
这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...
- java之hibernate之基于主键的双向一对一关联映射
这篇 基于主键的双向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构为: 2.类结构 Person.java public class Person implemen ...
- Hibernate(11)_基于外键的双向1对1
一.基于外键的双向1对1 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true&q ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...
- Hibernate关系映射(一) 基于外键的单向一对一
模拟用户和地址的映射关系,一个用户只有一个地址,用户知道地址,但是地址不知道用户.用户对地址的单向一对一映射. 一.建立实体类 Account.cs类 package com.lxit.entity; ...
- Hibernate 基于外键的单项一对一关联映射
在开发过程中很多时候会用到表与表之间一对一的关联关系,本文简单介绍在Hibernate4中单项一对一的关联映射. 1.设计表结构 2.创建Person对象 3.创建IdCard对象 4.写hbm.xm ...
随机推荐
- python3中使用xpath无法定位,为什么一直返回空列表?
tbody问题: 在爬去某些网站一些信息的时候,xpath工具上显示类容是正确的,但是在scrapy代码中一直返回空列表 Scrapy的部分代码: class LotteryspiderSpider( ...
- 发现一个FreeSWITCH bug
在研究FreeSWITCH视频会议的混屏问题时候发现一个bug. 已提交jira. 附上代码,问题很明显,不解释 =========================================== ...
- Xamarin XAML语言教程模板页面TemplatedPage
Xamarin XAML语言教程模板页面TemplatedPage 模板页面TemplatedPage 在上文中我们提到了TemplatedPage,它被称为模板页面,用来显示控件模版.Templat ...
- canvas 画椭圆
圆的标准方程(x-x0)²+(y-y0)²=r²中,有三个参数x0.y0.r,即圆心坐标为(x0, y0), 半径为 r圆的参数方程 x = x0 + r * cosθ, y = y0 + r * s ...
- 【BZOJ 4570】【SCOI 2016】妖怪
http://www.lydsy.com/JudgeOnline/problem.php?id=4570 对于每个妖怪的两个值,看成二位平面上的一个点的横纵坐标(x,y). 因为只关心a/b,所以设经 ...
- JZYZOJ1524 [haoi2012]外星人 欧拉函数
http://172.20.6.3/Problem_Show.asp?id=1524 大概可以算一个结论吧,欧拉函数在迭代的时候,每次迭代之后消去一个2,每个非2的质因子迭代一次又(相当于)生成一个2 ...
- JZYZOJ 1375 双亲数 莫比乌斯反演
http://172.20.6.3/Problem_Show.asp?id=1375 网上搜推理图. 有一段没有写莫比乌斯反演都快忘了..数学能力--,定理完全不会推,但是这道题整体来说应该是比较好写 ...
- 【最大流】POJ3236-ACM Computer Factory
[题意] 装配一个电脑需要P个零件,现在给出N机器的信息,每个机器可以将k个电脑由状态{S1,S2..,Sp}转变为{Q1,Q2..,Qp},问最多能装配多少台电脑以及对应的方案? [思路] 1A.. ...
- bzoj 1783: [Usaco2010 Jan]Taking Turns
1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...
- Java学习笔记(13)
StringBuffer 增加 append(boolean b) 可以添加任意类型的数据到容器中 insert(int offset,boolean b) 指定插入的索引值,插入对应的内容 ...