作者: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. Thinking in Java 之classpath理解

    等待写: <Thinking in Java> page127

  2. 网络协议栈学习(一)socket通信实例

    网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...

  3. 福大软工 1816:项目UML设计(团队作业三)

    项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...

  4. JVM --- OutOfMemoryError异常

    在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有可能发生OutOfMemoryError(OOM)异常. 1.Java堆溢出 Java堆用于存储对象实例,只要不断地创 ...

  5. Ubuntu使用Remastersys封装制作系统ISO镜像

    首先下载Remastersys的Deb软件包 链接:http://pan.baidu.com/s/1i3tYPKT 密码:qvyd 使用命令强制安装 dpkg --force-all -i remas ...

  6. TCP/IP网络知识点总结

    学完了计算机网络是时候整理一篇总结了,温故知新.注意:这篇博客很长长长(2.5万字+50图). TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是 ...

  7. 解决tensorflow的"Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Using TensorFlow backend."警告问题

    问题描述 程序开始运行的时候报出警告:I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructio ...

  8. HDU 2853 && HDU 3315

    http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:给一个n-m二分图,边权用一个n*m的矩阵表示,给出初始匹配,求二分图完美匹配相比初始匹配改变了几条 ...

  9. 批量解帧视频文件cpp

    前言 将多个视频文件进行解帧. 实现过程 1.批量获取文件路径: 2.对某个视频文件进行解帧: 代码 /************************************************ ...

  10. git中的needs merge问题

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