作者: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. hdu2665

    题解: 裸的主席树,记录最小值 代码: #include<cstdio> #include<cmath> #include<algorithm> #include& ...

  2. XML——Schema

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. JS实现点击按钮,下载文件

    PS:本文说的,并非如何用js创建流.创建文件.实现下载功能. 而是说的:你已知一个下载文件的后端接口,前端如何请求该接口,实现点击按钮.下载文件到本地.(可以是zip啦.excel啦都是一样) 有两 ...

  4. 掌握 javascript 核心概念 最好的教程 系列 之一

    链接 新链接 函数优先, 在扫描创建变量阶段, 会先收集函数, 如果前面有同名函数或者变量, 这个新函数会覆盖前面同名的: 而如果这时候是变量, 则不能去覆盖前面已有的值. function test ...

  5. android编译环境安装

    Android 编译环境安装 安装 Java 6 安装 Java 6 安装依赖包 (Ubuntu 12.04) $ sudo apt-get install git gnupg flex bison ...

  6. C高级第一次PTA作业 要求三

    要求一.要求二 内容链接:http://www.cnblogs.com/X-JY/p/8550457.html 一.PTA作业中的知识点总结 1.6-1 计算两数的和与差(10 分) (1)*在程序中 ...

  7. SMON进程、PMON进程、LGWR/ARCH

    SMON 进程:system monitor instance monitor 系统监控.实例监控进程 说明及作用:在实例关闭时,会清理临时段,整理空闲空间free space; 实例非正常关闭后,启 ...

  8. TJU Problem 1015 Gridland

    最重要的是找规律. 下面是引用 http://blog.sina.com.cn/s/blog_4dc813b20100snyv.html 的讲解: 做这题时,千万不要被那个图给吓着了,其实这题就是道简 ...

  9. git中的needs merge问题

    这个问题是在先“储藏”起来了,后面再调用出来出现的错误. 解决的方法就是通过git add    ,git commit -m  提交上去就可以了.

  10. 把默认功能关闭,当做普通IO口使用。

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁止 JTAG选择SW模式,从而 PA15 可以做普通 IO 使用,否则 PA15 ...