zoukankan      html  css  js  c++  java
  • 【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)

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

    执行后的结果:





  • 相关阅读:
    Kafka项目实战-用户日志上报实时统计之编码实践
    MapReduce-深度剖析
    Word 页码设置教程:如何删除封面和目录的目录?
    Pytorch autograd,backward详解
    Pytorch Sampler详解
    Pytorch并行计算:nn.parallel.replicate, scatter, gather, parallel_apply
    论文笔记系列-Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation
    Pytorch: parameters(),children(),modules(),named_*区别
    Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?
    如何理解正定矩阵和半正定矩阵
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/4547537.html
Copyright © 2011-2022 走看看