作者:ssslinppp      

1. 摘要



主要讲解N-1关系表的设计,N:从表,1:主表;
从表(N)中使用外键关联到主表(1),单向的;

场景:
许多人(N)可以住在同一个地方(1),知道人就可以知道这个人的地址;
反过来,知道地址,不能知道该地址住的人。

2. 数据表设计


地址表:

Person表:
e


3. 实体类-注解方式


Address.java

  1. package org.crazyit.app.domain;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. @Entity
  9. @Table(name="address_inf")
  10. public class Address
  11. {
  12. // 标识属性
  13. @Id @Column(name="address_id")
  14. @GeneratedValue(strategy=GenerationType.IDENTITY)
  15. private int addressId;
  16. // 定义地址详细信息的成员变量
  17. private String addressDetail;
  18. // 无参数的构造器
  19. public Address()
  20. {
  21. }
  22. // 初始化全部成员变量的构造器
  23. public Address(String addressDetail)
  24. {
  25. this.addressDetail = addressDetail;
  26. }
  27. // addressId的setter和getter方法
  28. public void setAddressId(int addressId)
  29. {
  30. this.addressId = addressId;
  31. }
  32. public int getAddressId()
  33. {
  34. return this.addressId;
  35. }
  36. // addressDetail的setter和getter方法
  37. public void setAddressDetail(String addressDetail)
  38. {
  39. this.addressDetail = addressDetail;
  40. }
  41. public String getAddressDetail()
  42. {
  43. return this.addressDetail;
  44. }
  45. }

Person.java

  • @JoinColumn :用于定义外键,数据库层面的,name值是数据表中的字段值;
  • @ManyToOne  :java类层面的;
  • @Cascade   : 设置级联,系统先自动级联插入主表记录,再插入从表记录==>因为在插入从表(N)记录时,指定的外键不能为null,所以在插入从表记录之前,需要有对应的主表(1)记录存在,若不存在对应的主表记录,则会报错。这里设置@Cascade ,可以保证在主表记录还没有插入而是先插入了从表记录时,Hibernate会自动先将主表记录保存,然后再保存从表记录。这就是级联的意思。


  1. package org.crazyit.app.domain;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.JoinColumn;
  8. import javax.persistence.ManyToOne;
  9. import javax.persistence.Table;
  10. import org.hibernate.annotations.Cascade;
  11. import org.hibernate.annotations.CascadeType;
  12. @Entity
  13. @Table(name="person_inf")
  14. public class Person
  15. {
  16. // 标识属性
  17. @Id @Column(name="person_id")
  18. @GeneratedValue(strategy=GenerationType.IDENTITY)
  19. private Integer id;
  20. private String name;
  21. private int age;
  22. // 定义该Person实体关联的Address实体
  23. @ManyToOne(targetEntity=Address.class)
  24. // 映射外键列,指定外键列的列名为address_id、不允许为空
  25. @JoinColumn(name="address_id" , nullable=false)
  26. @Cascade(CascadeType.ALL)
  27. private Address address;
  28. // id的setter和getter方法
  29. public void setId(Integer id)
  30. {
  31. this.id = id;
  32. }
  33. public Integer getId()
  34. {
  35. return this.id;
  36. }
  37. // name的setter和getter方法
  38. public void setName(String name)
  39. {
  40. this.name = name;
  41. }
  42. public String getName()
  43. {
  44. return this.name;
  45. }
  46. // age的setter和getter方法
  47. public void setAge(int age)
  48. {
  49. this.age = age;
  50. }
  51. public int getAge()
  52. {
  53. return this.age;
  54. }
  55. // address的setter和getter方法
  56. public void setAddress(Address address)
  57. {
  58. this.address = address;
  59. }
  60. public Address getAddress()
  61. {
  62. return this.address;
  63. }
  64. }


4. 测试





  1. package lee;
  2. import org.crazyit.app.domain.Address;
  3. import org.crazyit.app.domain.Person;
  4. import org.hibernate.Session;
  5. import org.hibernate.Transaction;
  6. public class PersonManager
  7. {
  8. public static void main(String[] args)
  9. {
  10. PersonManager mgr = new PersonManager();
  11. mgr.testCascase();
  12. HibernateUtil.sessionFactory.close();
  13. }
  14. private void testCascase()
  15. {
  16. Session session = HibernateUtil.currentSession();
  17. Transaction tx = session.beginTransaction();
  18. Person p = new Person();
  19. Address a = new Address("SuZhou"); // ①
  20. p.setName("ZhangSan");
  21. p.setAge(21);
  22. p.setAddress(a);
  23. // 持久化Person对象
  24. session.persist(p);
  25. // 创建一个瞬态的Address对象
  26. Address a2 = new Address("ShangHai"); // ②
  27. // 修改持久化状态的Person对象
  28. p.setAddress(a2); // ③
  29. tx.commit();
  30. HibernateUtil.closeSession();
  31. }
  32. private void testPerson()
  33. {
  34. Session session = HibernateUtil.currentSession();
  35. Transaction tx = session.beginTransaction();
  36. // 创建一个Person对象
  37. Person p = new Person();
  38. // 设置Person的name为crazyit字符串
  39. p.setName("WangWu");
  40. p.setAge(21);
  41. // 持久化Person对象(对应于插入主表记录)
  42. session.save(p);
  43. // 创建一个瞬态的Address对象
  44. Address a = new Address("GuangZhou"); // ①
  45. // 先设置Person和Address之间的关联关系
  46. p.setAddress(a);
  47. // 再持久化Address对象(对应于插入从表记录)
  48. session.persist(a);
  49. // 创建一个瞬态的Address对象
  50. Address a2 = new Address("BeiJing"); // ②
  51. // 先设置Person和Address之间的关联关系
  52. p.setAddress(a2);
  53. // 再持久化Address对象(对应于插入从表记录)
  54. session.persist(a2); // ③
  55. tx.commit();
  56. HibernateUtil.closeSession();
  57. }
  58. }

执行后的结果:

【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)的更多相关文章

  1. Hibernate学习笔记(四)关系映射之一对一关联映射

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

  2. Hibernate学习笔记(四)—— 表与表的关系

    一.一对多|多对一 1.1 关系表达 1.1.1 表中的表达 建表原则:在多的一方创建外键指向一的一方的主键. 1.1.2 实体中的表达 [客户实体] public class Customer { ...

  3. Hibernate学习笔记(一)-->数据库单表操作

    Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibern ...

  4. hibernate学习笔记(4)表单操作

    User.hbm.xml的表单配置: ①主键 <id name="id" type="java.lang.Integer"> <column ...

  5. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  6. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  7. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  8. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  9. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  10. Flutter学习笔记(13)--表单组件

    如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...

随机推荐

  1. Maven 入门篇 ( 上 )

    写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 maven 来构建运行 hello ...

  2. 使用Messenger 从Activity发送数据到service 通过后台计算结果Log输出;

    package com.lixu.messenger; import android.app.Activity; import android.app.Service; import android. ...

  3. 如何高效使用Google

    摘自http://simplyy.space/ 核心思想 1.首先,想好你想要寻找什么. 哪些词能够最好地描述你要寻找的信息或者概念? 哪些词是你能够用来替换的? 有没有那些词是可以不必包括在你想要搜 ...

  4. 1.5 C++ new和delete操作符

    参考:http://www.weixueyuan.net/view/6331.html 在C语言中,动态分配和释放内存的函数是malloc.calloc和free,而在C++语言中,new.new[] ...

  5. iOS 9 通用链接(Universal Links)

    什么是Universal Links? 在iOS9之前,对于从各种从浏览器.Safari中唤醒APP的需求,我们通常只能使用scheme.但是这种方式需要提前判断系统中是否安装了能够响应此scheme ...

  6. 转:HTML5中的element.dataset

    使用HTML5中的 element.dataset 操作自定义 data-* 数据: 不久之前我向大家展示了非常有用的classList API,它是一种HTML5里提供的原生的对页面元素的CSS类进 ...

  7. grep命令与正则表达式

    搜寻特定字符串the 常用参数:-a 将binary档案以test档案的方式搜寻数据    -c  计算找到'搜寻字符串'的次数    -i 忽略大小写的不同  -n  顺便输出行号  -v  反向选 ...

  8. Linux:rm:du命令

    RM 删除选项rm -r 递归删除,删除目录下所有 删除当前文件下所有文件呢? rm -rf * rm -f 忽略删除提醒 万千从中找到文件删除 ls |grep abc |xargs rm -f 保 ...

  9. 【图像处理】Haar-like特征

    特征提取的原理.代码等: 如果是白黑白,是减去一个黑的还是2个黑的,网上有不同的说法:应该需要看原论文了. 论文原文 The sum of the pixels which lie within th ...

  10. Unity3D插件-自制小插件、简化代码便于使用(新手至高手进阶必经之路)

    Unity3D插件-简化代码.封装功能 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 FindT() ...