在业务成的域模型中,类和类之间最普遍的关系就是关联关系,而关联也是有方向的。

就以例子来说明:一个人对应一张身份证。对其进行增删改。

对于人在数据创建表的时候,我们就给他两个字段,一个是id号,一个就是名字。

那么对于身份证也就是两个字段,一个对应于一个人相同的id号,一个就是身份证码。

1 那么来创建数据库表:

人为主表,身份证为从表。

  1. create table person(
  2. id bigint primary key auto_increment,
  3. userName varchar(20)
  4. );
  5.  
  6. create table card(
  7. id bigint primary key,
  8. cardNo varchar(18)
  9. );

创建实体类的时候,人要引用身份证卡的信息,同样身份证卡也要引用人这个类。

2 那么来创建实体类:

人:

  1. package com.cy.beans;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Person implements Serializable {
  6.  
  7. private static final long serialVersionUID = 1L;
  8. private long id;
  9. private String userName;
  10. private Card card;// 卡 一对一关联
  11.  
  12. public void person() {
  13.  
  14. }
  15.  
  16. public long getId() {
  17. return id;
  18. }
  19.  
  20. public void setId(long id) {
  21. this.id = id;
  22. }
  23.  
  24. public String getUserName() {
  25. return userName;
  26. }
  27.  
  28. public void setUserName(String userName) {
  29. this.userName = userName;
  30. }
  31.  
  32. public Card getCard() {
  33. return card;
  34. }
  35.  
  36. public void setCard(Card card) {
  37. this.card = card;
  38. }
  39.  
  40. @Override
  41. public String toString() {
  42. return "Person [id=" + id + ", userName=" + userName + ", card=" + card
  43. + "]";
  44. }
  45.  
  46. }

身份证:

  1. package com.cy.beans;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Card implements Serializable{
  6.  
  7. private static final long serialVersionUID = 1L;
  8.  
  9. private long id;
  10. private String cardNo;
  11. private Person person;//人 一对一关联
  12.  
  13. public Card(){
  14.  
  15. }
  16. public long getId() {
  17. return id;
  18. }
  19. public void setId(long id) {
  20. this.id = id;
  21. }
  22. public String getCardNo() {
  23. return cardNo;
  24. }
  25. public void setCardNo(String cardNo) {
  26. this.cardNo = cardNo;
  27. }
  28. public Person getPerson() {
  29. return person;
  30. }
  31. public void setPerson(Person person) {
  32. this.person = person;
  33. }
  34. @Override
  35. public String toString() {
  36. return "Card [id=" + id + ", cardNo=" + cardNo + ", person=" + person
  37. + "]";
  38. }
  39.  
  40. }

现在创建映射文件

Person.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  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.  
  6. <hibernate-mapping>
  7.  
  8. <class name="com.cy.beans.Person" table="person" catalog="j2ee"> <!-- catalog数据库 -->
  9.  
  10. <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
  11. <column name="id"></column><!-- 此行的ID,为表字段ID -->
  12. <generator class="increment"></generator><!-- 给id指定生成策略 -->
  13. </id>
  14.  
  15. <property name="userName" type="java.lang.String">
  16. <column name="userName"></column>
  17. </property>
  18.  
  19. <!--站在主对象的一方来设置级联关系 -->
  20. <!-- cascade定义的是关系两端对象到对象的级联关系,cascade有四個取值,all,none,save-update,delete
  21. all : 所有情况下均进行关联操作。
  22. none:所有情况下均不进行关联操作。这是默认值。
  23. save-update:在执行save/update/saveOrUpdate时进行关联操作。
  24. delete:在执行delete时进行关联操作。 -->
  25. <one-to-one name="card" class="com.cy.beans.Card" cascade="all"></one-to-one>
  26.  
  27. </class>
  28.  
  29. </hibernate-mapping>

Card.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  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.  
  6. <hibernate-mapping>
  7. <class name="com.cy.beans.Card" table="card" catalog="j2ee"> <!-- catalog数据库 -->
  8. <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
  9. <column name="id"></column><!-- 此行的ID,为表字段ID -->
  10. <generator class="foreign"><!-- foreign主键生成器 -->
  11. <param name="property">person</param><!--类属性 -->
  12. </generator>
  13. </id>
  14.  
  15. <property name="cardNo" type="java.lang.String">
  16. <column name="cardNo"></column>
  17. </property>
  18. <!--站在从对象的一方来设置交出约束 -->
  19. <!-- name:一对一节点 ,constrained: 约束(必须为true) -->
  20. <one-to-one name="person" class="com.cy.beans.Person" constrained="true"></one-to-one>
  21.  
  22. </class>
  23. </hibernate-mapping>

在hibernate.cfg.xml里添加对象xml文件:

  1. 1 <mapping resource="com/cy/xmls/Person.hbm.xml"/>
  2. <mapping resource="com/cy/xmls/Card.hbm.xml"/>

工具类:

  1. package com.cy.tools;
  2.  
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  5. import org.hibernate.cfg.Configuration;
  6. import org.hibernate.service.ServiceRegistry;
  7.  
  8. /**
  9. * session工厂的工具类
  10. * @author acer
  11. *
  12. */
  13.  
  14. public class HibernateUtils {
  15.  
  16. private static Configuration cfg;
  17. private static SessionFactory sessionFactory;
  18. private static ServiceRegistry serviceRegistry;
  19.  
  20. static{
  21.  
  22. cfg = new Configuration().configure();
  23. serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
  24. sessionFactory = cfg.buildSessionFactory(serviceRegistry);
  25.  
  26. }
  27.  
  28. public static SessionFactory getSessionFactory(){
  29. return sessionFactory;
  30. }
  31.  
  32. }

IPersonDao.java接口,定义方法:

  1. package com.cy.dao;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import com.cy.beans.Person;
  6.  
  7. public interface IPersonDao {
  8. /**
  9. * 添加
  10. * @param p
  11. */
  12. public void savePerson(Person p);
  13. /**
  14. * 修改
  15. * @param p
  16. */
  17. public void updatePerson(Person p);
  18. /**
  19. * 刪除
  20. * @param p
  21. */
  22. public void deletePerson(Person p);
  23. /**
  24. * 根据id查询数据
  25. * @param cls
  26. * @param pk
  27. * @return
  28. */
  29. public Person getPerson(Class<?> cls,Serializable pk);
  30.  
  31. public void findPerson(Person p);
  32.  
  33. }

写接口实现:PersonDaoImpl.java

  1. package com.cy.dao.impl;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;
  7.  
  8. import com.cy.beans.Person;
  9. import com.cy.dao.IPersonDao;
  10. import com.cy.tools.HibernateUtils;
  11.  
  12. public class PersonDaoImpl implements IPersonDao {
  13.  
  14. @Override
  15. public void savePerson(Person p) {
  16. //获得Session
  17. Session session=null;
  18. Transaction transaction=null;
  19.  
  20. try {
  21. session=HibernateUtils.getSessionFactory().openSession();//
  22. transaction=session.beginTransaction();//开启事务
  23. session.save(p);//添加
  24. transaction.commit();//提交事务
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. transaction.rollback();//回滚事务
  28. }finally{
  29. session.close();//关闭session
  30. }
  31.  
  32. }
  33.  
  34. @Override
  35. public void updatePerson(Person p) {
  36. Session session=null;
  37. Transaction transaction=null;
  38.  
  39. try {
  40. session=HibernateUtils.getSessionFactory().openSession();
  41. transaction=session.beginTransaction();
  42. session.update(p);//修改
  43. transaction.commit();
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. transaction.rollback();
  47. }finally{
  48. session.close();
  49. }
  50.  
  51. }
  52.  
  53. @Override
  54. public Person getPerson(Class<?> cls, Serializable pk) {
  55. Session session=null;
  56. Transaction transaction=null;
  57. Person person=null;
  58. try {
  59. session=HibernateUtils.getSessionFactory().openSession();
  60. transaction=session.beginTransaction();
  61. person=(Person) session.get(cls, pk);//根据id查询。pk这里指的就是id
  62. transaction.commit();
  63.  
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. transaction.rollback();
  67. }finally{
  68. session.close();
  69. }
  70.  
  71. return person;
  72. }
  73. @Override
  74. public void deletePerson(Person p) {
  75. Session session=null;
  76. Transaction transaction=null;
  77.  
  78. try {
  79. session=HibernateUtils.getSessionFactory().openSession();
  80. transaction=session.beginTransaction();
  81. session.delete(p);//删除
  82. transaction.commit();
  83. } catch (Exception e) {
  84. e.printStackTrace();
  85. transaction.rollback();
  86. }finally{
  87. session.close();
  88. }
  89.  
  90. }
  91.  
  92. @Override
  93. public void findPerson(Person p) {
  94.  
  95. }
  96.  
  97. }

写IPersonServer.java接口

  1. package com.cy.server;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import com.cy.beans.Person;
  6.  
  7. public interface IPersonServer {
  8. /**
  9. * 添加
  10. * @param p
  11. */
  12. public void savePerson(Person p);
  13. /**
  14. * 修改
  15. * @param p
  16. */
  17. public void updatePerson(Person p);
  18. /**
  19. * 刪除
  20. * @param p
  21. */
  22. public void deletePerson(Long id);
  23. /**
  24. * 根据id查询
  25. * @param cls
  26. * @param pk
  27. * @return
  28. */
  29. public Person getPerson(Class<?> cls,Serializable pk);
  30.  
  31. public void findPerson(Person p);
  32. }

写PersonServerImpl.java实现;

  1. package com.cy.server.impl;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import com.cy.beans.Person;
  6. import com.cy.dao.IPersonDao;
  7. import com.cy.dao.impl.PersonDaoImpl;
  8. import com.cy.server.IPersonServer;
  9.  
  10. public class PersonServerImpl implements IPersonServer {
  11. IPersonDao dao = new PersonDaoImpl();
  12.  
  13. @Override
  14. public void savePerson(Person p) {
  15. dao.savePerson(p);
  16.  
  17. }
  18.  
  19. @Override
  20. public void updatePerson(Person p) {
  21. dao.updatePerson(p);
  22. }
  23.  
  24. @Override
  25. public void deletePerson(Long id) {
  26. Person p = dao.getPerson(Person.class, id);
  27. if (p != null) {
  28. dao.deletePerson(p);
  29. }
  30.  
  31. }
  32.  
  33. @Override
  34. public Person getPerson(Class<?> cls, Serializable pk) {
  35.  
  36. return dao.getPerson(cls, pk);
  37. }
  38.  
  39. @Override
  40. public void findPerson(Person p) {
  41.  
  42. }
  43.  
  44. }

写个PersonAction测试;

  1. package com.cy.action;
  2.  
  3. import com.cy.beans.Card;
  4. import com.cy.beans.Person;
  5. import com.cy.server.IPersonServer;
  6. import com.cy.server.impl.PersonServerImpl;
  7.  
  8. public class PersonAction {
  9. public static void main(String[] args) {
  10.  
  11. // savePerson();
  12. // updatePerson();
  13. deletePerson();
  14. }
  15.  
  16. private static void deletePerson() {
  17. IPersonServer ps=new PersonServerImpl();
  18. ps.deletePerson(Long.valueOf(1));
  19.  
  20. }
  21.  
  22. private static void updatePerson() {
  23. IPersonServer ps=new PersonServerImpl();
  24. Person p=ps.getPerson(Person.class, Long.valueOf(1));
  25. p.setUserName("小紅");
  26. ps.updatePerson(p);
  27. /*Hibernate: //这些hibernate所执行语句 修查询 后修改
  28. select
  29. person0_.id as id1_1_0_,
  30. person0_.userName as userName2_1_0_,
  31. card1_.id as id1_0_1_,
  32. card1_.cardNo as cardNo2_0_1_
  33. from
  34. j2ee.person person0_
  35. left outer join
  36. j2ee.card card1_
  37. on person0_.id=card1_.id
  38. where
  39. person0_.id=?
  40. Hibernate:
  41. update
  42. j2ee.person
  43. set
  44. userName=?
  45. where
  46. id=?
  47. Hibernate:
  48. update
  49. j2ee.card
  50. set
  51. cardNo=?
  52. where
  53. id=?
  54. */
  55.  
  56. }
  57.  
  58. private static void savePerson() {
  59. IPersonServer ps=new PersonServerImpl();
  60. Person p=new Person();
  61. p.setUserName("小明");
  62. Card c=new Card();
  63. c.setCardNo("511123************");
  64. //設置相互
  65. p.setCard(c);
  66. c.setPerson(p);
  67. ps.savePerson(p);
  68. /*Hibernate: 添加时 先查询主表的最大的id,先添加主表,在添加从表。 删除时则是先删除从表,在删除主表。
  69. select
  70. max(id)
  71. from
  72. person
  73. Hibernate:
  74. insert
  75. into
  76. j2ee.person
  77. (userName, id)
  78. values
  79. (?, ?)
  80. Hibernate:
  81. insert
  82. into
  83. j2ee.card
  84. (cardNo, id)
  85. values
  86. (?, ?)
  87.  
  88. */
  89.  
  90. }
  91. }

Hibernate关联关系映射之一对一(主键关联)的更多相关文章

  1. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  2. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  3. 010一对一 主键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  4. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  5. Hibernate5.2之一对一主键关联(四)

                                                      Hibernate5.2之一对一主键关联(四) 一.简介 一对一关联关系分为两种:a.主键关联:b. ...

  6. hibernate5(12)注解映射[4]一对一外键关联

    在实际博客站点中,文章内容的数据量非常多,它会影响我们检索文章其他数据的时间,如查询公布时间.标题.类别的等. 这个时候,我们能够尝试将文章内容存在还有一张表中,然后建立起文章--文章内容的一对一映射 ...

  7. Hibernate注解:一对一主键关联

    情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...

  8. hibernate 关系映射之 双向外键关联一对一

    在上一篇博客内容的基础上做了以下修改,即可实现.   注解方式:   package com.bjsxt.hibernate; import javax.persistence.Entity; imp ...

  9. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

随机推荐

  1. noip第6课作业

    1.    数据统计 [问题描述] 输入N个整数,求出它们的最小值.最大值和平均值(保留3位小数).输入保证这些数都是不超过1000的整数.(1<=N<=1000) [样例输入] 8 2 ...

  2. 谈谈HashMap线程不安全的体现

    原文出处: Hosee HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了. 那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什么情况呢 ...

  3. js跳转页面方法实现汇总

    一.页面之间的跳转传参 1.在页面之间跳转的方式有两种: window.location.href=”test.html?num=10”   地址会改变参数也会被传递但是不会打开新窗口 window. ...

  4. AngularJS ngTemplate寄宿方式 模板缓存 $templateCache

    AngularJS的指令中经常定义模板(template或templateUrl),可以选择将Html模板直接寄宿在WEB容器中,如Tomcat.IIS.Nginx.NodeJs Express,也可 ...

  5. ASP.NET MVC Form表单验证与Authorize特性

    一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...

  6. MFC坐标系

    MFC坐标系分为设备坐标系和逻辑坐标系两种.在设备坐标系中,一个像素表示一个单位长度,设备的原点(0,0)始终在显示平面的左上角位置,x轴正向向右,y轴正向向下. 逻辑坐标系中,原点可以放在任何一个位 ...

  7. cocos游戏的例子(摘抄记录,非原创)

    3.1 搭建Cocos2d-JS v3.x 开发环境 下载所需的软件包 下载 Cocos Code IDE.目前 Cocos Code IDE 最新发布版本是 1.0.0-RC2.我们为什么 Coco ...

  8. [logic]逻辑整理

    圈子详情页面:    1.加入圈子(*)        1.已登录,直接添加        2.未登录,登陆框    2.发表新帖(*)        1.已登录,直接跳转        2.未登录, ...

  9. nips 2016 吴恩达

    一年一度的 NIPS 又来了.今年举办地是笔者最爱的欧洲城市巴塞罗那.阳光沙滩配学术,确实很爽.这次的会议的第一天开场的大部分时间安排给了 tutorial.其中人数爆满的依旧是吴恩达(AndrewN ...

  10. 索引视图DEMO1

    --use tempdb ----------------------在创建视图和所有底层表时,必须打开ANSI_NULLS以及QUOTED_IDENTIFIER选项 --SET ANSI_NULLS ...