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

Copany         Address

 id<Pk>          id<Pk><Fk>

 name              home

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

  1. <generator class="foreign">
  2. <param name="property">idcharbean</param>
  3. </generator>

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

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

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

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

  

  1. package com.java.bean;
  2.  
  3. public class Idcharbean {
  4. private int id;
  5. private int nameber;
  6. private Person person;
  7.  
  8. public int getId() {
  9. return id;
  10. }
  11.  
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15.  
  16. public int getNameber() {
  17. return nameber;
  18. }
  19.  
  20. public void setNameber(int nameber) {
  21. this.nameber = nameber;
  22. }
  23.  
  24. public Person getPerson() {
  25. return person;
  26. }
  27.  
  28. public void setPerson(Person person) {
  29. this.person = person;
  30. }
  31. }

hm.xml 配置

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

有外键方(Person)配置 bean

  

  1. package com.java.bean;
  2.  
  3. public class Person {
  4. private int id;
  5. private String name;
  6. private Idcharbean idcharbean;
  7.  
  8. public int getId() {
  9. return id;
  10. }
  11.  
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23.  
  24. public Idcharbean getIdcharbean() {
  25. return idcharbean;
  26. }
  27.  
  28. public void setIdcharbean(Idcharbean idcharbean) {
  29. this.idcharbean = idcharbean;
  30. }
  31. }

hbm.xml配置

  

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

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

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

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

  1. 关于 constrained="true"
    *指定为当前持久化类的对应表的主键添加外键约束 应用被关联的对象 "对方"所对应的数据库表主键
  2.  
  3. 配置完成后写个增加 玩一下
      
  1. public class Idchardao {
  2. private static SessionFactory sf;
  3. static {
  4. try {
  5. Configuration configuration = new Configuration();
  6. configuration.configure();
  7. ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
  8. sf = configuration.buildSessionFactory(serviceRegistry);
  9. }catch (Exception e){
  10. throw e;
  11. }
  12. }
  13. public void add(Idcharbean idcharbean){
  14. Session s = sf.openSession();
  15. Transaction t =null;
  16. try {
  17. t = s.beginTransaction();
  18. s.save(idcharbean);
  19. t.commit();
  20. }catch (Exception e){
  21. t.rollback();
  22. }finally {
  23. s.close();
  24. }
  25. }
  26. }

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

然后是test文件 添加一下

  1. @Test
  2. public void testAdd() throws Exception {
  3. Idcharbean idcharbean = new Idcharbean();
  4. idcharbean.setNameber(1111);
  5. Person person = new Person();
  6. person.setName("马虎");
  7.  
  8. idcharbean.setPerson(person);
  9. person.setIdcharbean(idcharbean);
  10.  
  11. new Idchardao().add(idcharbean);
  12. new Psersondao().add(person);
  13.  
  14. }

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

  

  1. 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;
    }

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

  

  1. //解除关系
  2. public void Remove() {
  3. Session s = sf.openSession();
  4. Transaction t = null;
  5. try {
  6. t = s.beginTransaction();
  7. Person person = (Person) s.get(Person.class, 1);
  8. person.setIdcharbean(null);
  9. t.commit();
  10. } catch (Exception e) {
  11. t.rollback();
  12. } finally {
  13. s.close();
  14. }
  15.  
  16. }

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

  

  1. //删除
  2. public void delet(){
  3. Session s = sf.openSession();
  4. Transaction t = null;
  5. try {
  6. t = s.beginTransaction();
  7. Person person = (Person) s.get(Person.class,1);
  8.  
  9. s.delete(person);
  10. /* Idcharbean idcharbean = (Idcharbean) s.get(Idcharbean.class,1);
  11. s.delete(idcharbean);*/
  12. t.commit();
  13. }catch (Exception e){
  14. t.rollback();
  15. }finally {
  16. s.close();
  17. }
  18. }
  1. 写完了 更多的方法 我在多对多中搞吧= = 话说为啥 我多对多还没写就写一对一了 我是不是疯了

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. MVC3 项目总结

    验证 Validation 多样化验证规则 http://www.cnblogs.com/xling/archive/2012/07/11/2587002.html 最常见的验证方式是:在实体的属性上 ...

  2. Linux下使用Kickstart自动化安装平台架构

    PXE工作于Client/Server的网络模式.在启动过程中,终端要求服务器分配IP地址,再用TFTP协议下载一个自动启动软件包到内存中执行. 要使用kickstart安装平台,包括完整的架构为:K ...

  3. 一步一步设置Joomla!开发环境

    转载自:http://h2appy.blog.51cto.com/609721/373414 虽然是英文,可是写的非常浅显易懂,再配合截图,更是明了. http://docs.joomla.org/S ...

  4. Microsoft Visual C++ Compiler for Python 2.7真正下载地址

    真正下载地址: http://origin.www.ms.akadns.NET/en-us/download/details.aspx?id=44266 那个微软地址好像不可用.

  5. Java Code Style

    近期困惑于团队成员代码风格迥异,代码质量不可控,作为一名老司机,忧患于后期服务的可维护性,多次一对一的代码Review,耗时耗力不说,效果也不明显.痛定思痛,多次反思之后得出结论:无规矩不成方圆,可靠 ...

  6. Rafy 开源贡献中心 - 组织成立,并试运行一月小结

    背景 最近两年,工作中虽然大量使用了 Rafy 框架作为各个产品.项目的开发框架.我是 2015 年的年中加入现在这家公司的,由于我个人工作太忙的缘故,一直没怎么编码,Rafy 框架底层的核心成长也比 ...

  7. JavaScript(三、DOM文档对象模型)

    一.什么是DOM DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准. DOM 定义了访问 HTML 和 XML 文档的标准: &q ...

  8. Python:怎样用线程将任务并行化?

    如果待处理任务满足: 可拆分,即任务可以被拆分为多个子任务,或任务是多个相同的任务的集合: 任务不是CPU密集型的,如任务涉及到较多IO操作(如文件读取和网络数据处理) 则使用多线程将任务并行运行,能 ...

  9. 机器学习,流式IoT和医疗设备互联

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 让我们来看一下机器学习是如何应用于医护行业以及如何借助Apache Spark对患者的监控数据进行处理 现如今,IoT数据,实时流式数据分析 ...

  10. 全面认识openstack:OpenStack架构详解

    OpenStack构架知识梳理   OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟 ...