Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。基于外键的单向1-1的配置将与无连接表N-1关联的many-to-one增加unique="true"属性即可。
一个人(account)对应一个地址(address)。
二、实体
account类
package entity; import java.io.Serializable;
public class account implements Serializable{
public account(){ }
// 建议hibernate中不用使用id,name这种关键字 可能会报错
private int account_id;
private String account_name;
private String password;
//需要添加被控端的引用 此处添加的是对应关系 即一个人对应一个地址的地址对象
private address address; public int getAccount_id() {
return account_id;
}
public void setAccount_id(int account_id) {
this.account_id = account_id;
}
public String getAccount_name() {
return account_name;
}
public void setAccount_name(String account_name) {
this.account_name = account_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实体类
package entity;
import java.io.Serializable;
public class address implements Serializable{
public address(){
}
private int address_id;
private String address_name;
public int getAddress_id() {
return address_id;
}
public void setAddress_id(int address_id) {
this.address_id = address_id;
}
public String getAddress_name() {
return address_name;
}
public void setAddress_name(String address_name) {
this.address_name = address_name;
}
}
映射关系配置
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 = "entity.account" table ="account">
<id column = "account_id" name = "account_id">
<generator class="native"/> <!--主键生成方式 所以在创建表的时候要主键自增
--> </id>
<property name="account_name" type = "java.lang.String" column = "account_name"/>
<property name="password" type="java.lang.String" column = "password"/>
<!-- 通过many-to-one 标签添加唯一属性约束,建立一对一关联关系
此处映射的意思是 account的adress属性对应着外表的address_id列 且填加了唯一约束 说明address_id是唯一的 -->
<many-to-one name="address" column="address_id" 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 = "entity.address" table = "address">
<id name="address_id" column="address_id">
<generator class="native"/>
</id>
<!-- generated= never 标明此属性值不是从数据库中生成。generated默认值是never。
generated= insert 标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。
generated= always 标明此属性值在insert和update时都会被生成
-->
<property name="address_name" type = "java.lang.String" column = "address_name" generated="never" lazy="false"/>
</class>
</hibernate-mapping>
这里讲通用逻辑封装成了一个方法了
/**
* @author Administrator
*
*/
package HibernateUtil; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
private static SessionFactory factory;
static{
Configuration cnn = new Configuration().configure();
factory = cnn.buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
return factory;
}
public static Session getOneSession(){
return factory.openSession();
}
public static void ClossSession(Session session){
if(session != null){
session.close();
}
}
}
建表就不说了但是注意不要忘记创建自增和索引名字必须是Hibernate.sequence .
hibernate.hbm.xml同Hibernate学习一中的配置只是添加了映射文件 <mapping resource="account.hbm.xml"/><mapping resource="address.hbm.xml"/>
测试
package text; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import entity.account;
import entity.address; import HibernateUtil.HibernateUtil; public class textManytoOne { @Test
public void add(){
Transaction tx = null;
Session session = HibernateUtil.getOneSession();
tx=session.beginTransaction(); address address = new address();
address.setAddress_name("天津");
session.save(address); account account = new account();
account.setAccount_name("大伟哥666");
account.setPassword("123456");
account.setAddress(address); // 重复添加 account account1 = new account();
account1.setAccount_name("小老虎666");
account1.setPassword("123456");
account1.setAddress(address); try{
session.save(account);
session.save(account1);
tx.commit();
}catch(HibernateException e){
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.ClossSession(session);
}
}
}
总结注意
1.在多表实体类中记得添加被控端的对象的引用 且属性名字最好不用和关键字冲突
2.要在多表的映射文件中写上<many-to-one name="被控端引用对象" column="外键 也就是另一张表的主键" unique="是否对外键加唯一">
3.创建表的时候主键索引名字是Hibernate.sequence 不知道为什么 但是我的名字不是这个就报错
4.Hibernate的配置文件中记得添加实体类的映射文件 <mapping resource="xxx.hbm.xml">
Hibernate学习(二)关系映射----基于外键的单向一对一的更多相关文章
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- Hibernate关系映射(一) 基于外键的单向一对一
模拟用户和地址的映射关系,一个用户只有一个地址,用户知道地址,但是地址不知道用户.用户对地址的单向一对一映射. 一.建立实体类 Account.cs类 package com.lxit.entity; ...
- Hibernate关系映射(二) 基于外键的双向一对一
基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...
- Hibernate 基于外键的双向一对一关联映射
之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...
- java之hibernate之基于外键的双向一对一关联映射
这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...
- java之hibernate之基于主键的单向一对一关联映射
这篇讲 基于主键的单向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构应该为: 2.类结构 Person.java public class Person imple ...
- Hibernate(八):基于外键映射的1-1关联关系
背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...
- hibernate 基于主键的单向一对一关联映射
1.设计表结构 表结构对于基于外键的关联关系来说就少了外键的关联列,并且两张表共用同一个ID,表示一对一. 2.创建Person对象 3.创建IdCard对象 4.写hbm.xml文件 5.生成数据库 ...
- Hibernate学习之关系映射(转)
一.一对多 "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系.一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多.多对一:从订单的角度来说多个订单可以对应一 ...
随机推荐
- js获取本地ip和地区
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 基于HTML5及WebGL的工控SCADA模拟飞机飞行
昨天看到一篇文章说是学习如何开飞机的,然后我就想,如果我也可以开飞机那就好玩了,每个人小时候都想做飞行员!中国飞行员太难当了,再说也不轻易让你开飞机!后来我就想如果能用 HT 开飞机那就是真的有趣了, ...
- Max Sum Plus Plus
A - Max Sum Plus Plus Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- FTP&samba 服务简单部署
第1章 FTP服务部署 在Linux下,我们应用最广泛的FTP服务程序是 vsftpd ( TCP端口:而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与 ...
- CS231n 2017 学习笔记01——KNN(K-Nearest Neighbors)
本博客内容来自 Stanford University CS231N 2017 Lecture 2 - Image Classification 课程官网:http://cs231n.stanford ...
- outline
a标签 两种button按钮 默认带有一个虚线 outline 当他们被单击 和 激活以后 outline和border 很类似 ,但是有不同 1.outline 不能针对特定的边赋值 ,也就 ...
- Three.js 保存camera(视角)设置到数据库,包括场景的缩放、旋转、移动等
最近在做的项目中遇到需要保存当前的3d管道视角设置的问题,用户希望在对3d场景内的管道进行了缩放.旋转.移动之后可以将场景当前的视角状态保存在数据库中,并在下次加载时读取. 经过不断的尝试和研究,在同 ...
- 六:在线工具网站,让你PC上要装的软件少一半!
记住这几个在线工具网站,让你PC上要装的软件少一半! 一.uzer.me——丰富的云端应用聚合 这个云平台将我们常用的Office系列软件.Adobe家族的系列软件……乃至CAD制图都整合在了云端,随 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- Cordic算法——圆周系统之旋转模式
三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值.这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)= ...