作者: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. 用正则表达式输出rdf文档的三元组格式数据

    占个位置 1.输出所有尖括号里的内容 package com.jena; import java.io.BufferedReader; import java.io.FileReader; impor ...

  2. static 关键字介绍

    大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中 ...

  3. 在ant编译java文件时产生debug信息

    使用ant编译java文件时,如果没有设置debug属性,则不会产生编译信息,ant的默认设置是不打印编译信息. 如果想在编译过程中显示编译信息,需设置debug属性为true,并且设置debugLe ...

  4. DevExpress v17.2新版亮点—DevExtreme篇(一)

    用户界面套包DevExpress DevExtreme v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExtreme v17.2 的New Color Sche ...

  5. AVG Internet Security 2013 – 免费1年

    AVG 是一款来自捷克的老牌的且非常优秀的免费杀毒软件,自推出以来就颇受用户好评!一直以来诸多的优点使其获得不少忠实用户,即便在中国也赢得了不少粉丝!AVG的安全产品广泛地被欧美以及大洋洲地区使用,并 ...

  6. promise的生命周期

    每个promise都会经历一个短暂的生命周期: 先是处于进行中(pending)状态,此时操作并未完成,所以他也是未处理的(unsettled): 一旦异步惭怍执行结束,promise则 变为已处理( ...

  7. 【转】C# Socket通信编程

    https://www.cnblogs.com/dotnet261010/p/6211900.html#undefined 一:什么是SOCKET socket的英文原义是“孔”或“插座”.作为进程通 ...

  8. Redis服务器搭建/配置/及Jedis客户端的使用方法

    摘要 Redis服务器搭建.常用参数含意说明.主从配置.以及使用Jedis客户端来操作Redis Redis服务器搭建 安装 在命令行执行下面的命令: $ wget http://download.r ...

  9. netscope-支持caffe的在线可视化工具-转载

    Netscope是个支持prototxt格式描述的神经网络结构的在线可视工具,地址是here,可以用来可视化Caffe结构里prototxt格式的网络结构. Netscope使用起来也非常简单,打开这 ...

  10. liunx中安装包及其应用

    1. dpkg -i <package>  安装包 dpkg -r <package>   删除包 dpkg -P <package> 移除包和配置文件 dpkg ...