作者: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. typedef struct用法详解与小结

    1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef ...

  2. 【转载】maven入门1

    学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门) 2007-08-28 14:01:04 标签:maven 职场 休闲 一.前言         早就知道maven 在java 项目的管理 ...

  3. oracleXE默认的管理员登录用户

    管理员: account:sys@XE as sysdba     pwd:sys sys@XE as sysdba             system

  4. strtus2 文件上传

    struts2和spring mvc上传都是用 common-fileupload来实现 1.struts2上的方式需要在对应的Action,加上如下的属性以及get/set方法 private Fi ...

  5. Double H6.0

    Double H 博客链接 成员 学号 姓名 211606379 王熙航(队长) 211606364 李冠锐 211606350 曾磊鑫 211606457 郑沐榕 211606342 杨艺勇 211 ...

  6. DevExpress v17.2新版亮点—WinForms篇(五)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.开篇介绍了DevExpress WinForms v17.2 Data Grid Control ...

  7. React Native笔记整理

    判断一个APP页面时原生还是H5:http://www.cnblogs.com/sonice-cinsy/p/5671324.html 写给移动开发者的React Native指南:http://bl ...

  8. C语言基础:常见循环语句 分类: iOS学习 c语言基础 2015-06-10 21:46 13人阅读 评论(0) 收藏

    for语句 for( 初始化表达式; 循环判断条件  ;增量表达式); while(条件表达式){ 循环体; } 先判断条件表达式,如果为真就执行循环体,执行完再去判断条件表达式 do{ 循环体; } ...

  9. cmd 环境变量设置的简单方法

    1.查看当前所有可用的环境变量:输入 set 即可查看. 2.查看某个环境变量:输入 “set 变量名”即可,比如想查看temp变量的值,即输入 set temp 3.修改环境变量 :输入 “set ...

  10. final版——爱阅APP功能说明书

    爱阅APP功能说明书 一.引言 以下内容是final版的功能说明书. 新增功能: 1.WiFi传书 2.书友群跳转 3.网址内部打开 4.设置-->关于爱阅 5.设置-->TXT文本的翻页 ...