一对一的另一种解决方式就是主键关联,在这种关联关系中,要求两个对象的主键必须保持一致,通过两个表的主键建立关联关系须外键参与。 没法传图 我就用这个表示吧 看id

Copany         Address

 id<Pk>          id<Pk><Fk>

 name              home

基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方”

<generator class="foreign">
<param name="property">idcharbean</param>
</generator>

采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 属性还应增加 constrained=“true” 属性;另一端(company)增加one-to-one元素映射关联属性。

constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

    <one-to-one name="idcharbean" class="Idcharbean" constrained="true"></one-to-one>
   

无有外键方(Idcharbean)配置 bean:

  

package com.java.bean;

public class Idcharbean  {
private int id;
private int nameber;
private Person person; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getNameber() {
return nameber;
} public void setNameber(int nameber) {
this.nameber = nameber;
} public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
}
}

hm.xml 配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.java.bean">
<class name="Idcharbean" table="t_idcahr">
<id name="id" type="int" column="id">
<generator class="identity"/> <!--这个地方的配置是一对一的关键哟-->
</id>
<property name="nameber" type="int" column="nameber" length="20"/>
<one-to-one name="person" class="Person"></one-to-one>
</class>
</hibernate-mapping>

有外键方(Person)配置 bean

  

package com.java.bean;

public class Person  {
private int id;
private String name;
private Idcharbean idcharbean; 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 Idcharbean getIdcharbean() {
return idcharbean;
} public void setIdcharbean(Idcharbean idcharbean) {
this.idcharbean = idcharbean;
}
}

hbm.xml配置

  

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.java.bean">
<class name="Person" table="t_person">
<id name="id" type="int" column="id">
<generator class="foreign">
<param name="property">idcharbean</param> <!--这个就是共同主键-->
</generator>
</id>
<property name="name" type="string" column="name" length="20"/>
<one-to-one name="idcharbean" class="Idcharbean" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

关于 foregin:表示主键策略使用foreign

*表示根据对方主键生成自己的主键

*param子元素指定使用前持久化

关于 constrained="true"
*指定为当前持久化类的对应表的主键添加外键约束 应用被关联的对象 "对方"所对应的数据库表主键 配置完成后写个增加 玩一下
  
public class Idchardao {
private static SessionFactory sf;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sf = configuration.buildSessionFactory(serviceRegistry);
}catch (Exception e){
throw e;
}
}
public void add(Idcharbean idcharbean){
Session s = sf.openSession();
Transaction t =null;
try {
t = s.beginTransaction();
s.save(idcharbean);
t.commit();
}catch (Exception e){
t.rollback();
}finally {
s.close();
}
}
}

ps需要两个类dao里都有add哟

然后是test文件 添加一下

@Test
public void testAdd() throws Exception {
Idcharbean idcharbean = new Idcharbean();
idcharbean.setNameber(1111);
Person person = new Person();
person.setName("马虎"); idcharbean.setPerson(person);
person.setIdcharbean(idcharbean); new Idchardao().add(idcharbean);
new Psersondao().add(person); }

然后再写个  获取id可以获取到关联的对方id的小测试文件

  

public Idcharbean Get(){
Session s = sf.openSession();
Transaction t = null;
Idcharbean idcharbean = null;
try {
t = s.beginTransaction();
idcharbean = (Idcharbean) s.get(Idcharbean.class,1);
t.commit();
}catch (Exception e){
t.rollback();
}finally {
s.close();
}
return idcharbean;
}

不如在搞个 移除关系 说动手就动手

  

  //解除关系
public void Remove() {
Session s = sf.openSession();
Transaction t = null;
try {
t = s.beginTransaction();
Person person = (Person) s.get(Person.class, 1);
person.setIdcharbean(null);
t.commit();
} catch (Exception e) {
t.rollback();
} finally {
s.close();
} }

既然都移除了不如再来个删除玩玩

  

          //删除
public void delet(){
Session s = sf.openSession();
Transaction t = null;
try {
t = s.beginTransaction();
Person person = (Person) s.get(Person.class,1); s.delete(person);
/* Idcharbean idcharbean = (Idcharbean) s.get(Idcharbean.class,1);
s.delete(idcharbean);*/
t.commit();
}catch (Exception e){
t.rollback();
}finally {
s.close();
}
}
哟 写完了 更多的方法 我在多对多中搞吧= = 话说为啥 我多对多还没写就写一对一了 我是不是疯了

hibernate 一对一关系的更多相关文章

  1. hibernate(五) hibernate一对一关系映射详解

    序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WH 一.一对一关系的概述 一对一关系看起来简单 ...

  2. Hibernate学习(五)———— hibernate一对一关系映射详解

    一.一对一关系的概述 一对一关系看起来简单,其实也挺复杂的.其中关系就包含了四种,单向双向和主键关联外键关联. 什么意思呢,也就是包含了单向一对一主键关联.双向一对一主键关联,单向一对一外键关联,双向 ...

  3. Hibernate一对一关系映射

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

  4. hibernate一对一关系实现

    按照主键映射,按照外键映射 Address.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping P ...

  5. hibernate对象关系实现(二)一对一

    双向一对一以部门和经理为例: a.部门和经理类中各自由对方的引用:(省略了get/set方法) b.数据库两种方式实现:一种(b.1)是外键映射,并将外键添加唯一约束(至于哪个对象的主键做外键,可随意 ...

  6. Hibernate中的一对一关系详解(1)

    A:先讲讲一对一的关系(欲知其他关系,请看下篇) a:主键关联的一对一关系 一对一关系一般用主键关联,也就是说用主键值来维护两者的关系,一个表的主键存放另一个表的主键值.例如在员工与帐号中,我们取员工 ...

  7. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  8. Hibernate One-to-One Mappings 一对一关系映射

    Hibernate One-to-One Mappings 一对一关系映射 关键:一对一关系映射和多对一关系映射非常像.仅仅是unique 属性值为 true 样例:一个员工仅仅能有一个地址. Hib ...

  9. Hibernate学习8—Hibernate 映射关系(一对一)

    第一节:Hibernate 一对一映射关系实现 假设一个用户对应一个地址:   1)按照主键映射: User.java: package com.cy.model; public class User ...

随机推荐

  1. JAVA 创建对象4种方法

    java创建对象的几种方式 博客分类: java   (1) 用new语句创建对象,这是最常见的创建对象的方法.(2) 运用反射手段,调用java.lang.Class或者java.lang.refl ...

  2. Web运营手记

    1.图片是给活人用户看的,相对来讲,文字是给搜索引擎看的.精华内容争取要在网站或者频道主页里面让人看到. 2.搜索引擎喜欢看的几种文字:页面标题.关键词元信息(只有Bing管点用).描述(descri ...

  3. ubuntu10.04 安装oracle server 版 笔记

    1:从oracle 官网下载oracle 10g ,然后解压出一个database文件夹. 2 :创建RedHat的版本声明文件[默认ubuntu无法通过oracle 的检查] 在/etc/redha ...

  4. 正确截取List指定位置的内容

    正确截取List指定位置的内容 import java.util.ArrayList; import java.util.List; public class ListUtils { public s ...

  5. Scala编程入门---函数式编程

    高阶函数 Scala中,由于函数时一等公民,因此可以直接将某个函数传入其他函数,作为参数.这个功能是极其强大的,也是Java这种面向对象的编程语言所不具备的. 接收其他函数作为函数参数的函数,也被称作 ...

  6. 创建servlet的三种方式

    第一种方式,实现Servlet接口 package com.example.servlet; import java.io.IOException; import javax.servlet.Serv ...

  7. 洛谷 P1129 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

  8. (十分钟视频教程)nodejs基础实战教程3:react服务端渲染入门篇

    视频截图如下: (具体视频见文末) 前言: 这是小猫的第三篇node教程,本篇内容是由公众号粉丝票选得出的,相信大家对这篇教程是抱有较大希望的,这篇教程由小猫和一位多年的好朋友合作完成(笔名:谷雨,博 ...

  9. arcEngine开发之IMap、ILayer、IFeatureLayer和IFeatureClass关系

    刚开时学习 Engine 开发时,对于这几个接口之间的关系总是理不清,因此写下这篇文章做个总结. 是什么 在 engine 开发中,我觉得使用过程中应该将每个接口对应到 ArcMap 中的具体事物中, ...

  10. mysql导入数据中文乱码_ubuntu

    1.在ubuntu中mysql的部分编码格式不是utf-8,故在导文件的时候会出现中文乱码,Windows中编码格式为gbk,因此要修改mysql的编码方式为utf-8. 2.查看MySQL编码格式: ...