分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

使用注解的Hibernate one-to-many映射

发布时间:2023-09-06 01:16责任编辑:彭小芳关键词:Hibernate

One to many映射关系指的是两个实体间一个实体可以和多个实体有关联关系,但是多的这一端只能和一的这一端的一个实例有关系。它是一个1 到 n的关系。例如在任何的公司员工可以注册多个银行账户,一个银行账户只能和一个员工相关联,在这篇文章中我们将会学习怎么在Hibernate3中建立这种映射关系。

问题陈述

我们要写两个实体一个是Employee实体另一个是Account实体,这样多个银行账户就可以和一个员工关联了,但是这些账户不能被两个或以上的用户共享。

设计解决方案

这种问题可以使用两种方式解决。一种方式是在Account表中设置一个外键EMPLOYEE_ID,这一列指向Employee表的主键,这种方式没有两个账号可以和多个用户相关联,显然,为了完成这种限制,账号应该是独特的。另一种方式是建立一个连接表,比如说是叫EMPLOYEE_ACCOUNT,这个表有两列,EMP_ID作为EMPLOYEE表中主键的外键,对于ACCOUNT_ID也是这种情况。

使用外键连接

这种方式,两个实体都要负责建立关系并维护这种关系,EMPLOYEE实体应该申明的关系是one to many,Account实体应该声明的关系是many to one。首先来看一下关系设计:

EMPLOYEE实体
[java] view plain copy
  1. packagehibernate.test.oneToMany.foreignKeyAsso;
  2. importjava.io.Serializable;
  3. importjava.util.Set;
  4. importjavax.persistence.CascadeType;
  5. importjavax.persistence.Column;
  6. importjavax.persistence.Entity;
  7. importjavax.persistence.GeneratedValue;
  8. importjavax.persistence.GenerationType;
  9. importjavax.persistence.Id;
  10. importjavax.persistence.JoinColumn;
  11. importjavax.persistence.OneToMany;
  12. importjavax.persistence.Table;
  13. importjavax.persistence.UniqueConstraint;
  14. @Entity(name="ForeignKeyAssoEntity")
  15. @Table(name="Employee",uniqueConstraints={
  16. @UniqueConstraint(columnNames="ID"),
  17. @UniqueConstraint(columnNames="EMAIL")})
  18. publicclassEmployeeEntityimplementsSerializable{
  19. privatestaticfinallongserialVersionUID=-1798070786993154676L;
  20. @Id
  21. @GeneratedValue(strategy=GenerationType.IDENTITY)
  22. @Column(name="ID",unique=true,nullable=false)
  23. privateIntegeremployeeId;
  24. @Column(name="EMAIL",unique=true,nullable=false,length=100)
  25. privateStringemail;
  26. @Column(name="FIRST_NAME",unique=false,nullable=false,length=100)
  27. privateStringfirstName;
  28. @Column(name="LAST_NAME",unique=false,nullable=false,length=100)
  29. privateStringlastName;
  30. @OneToMany(cascade=CascadeType.ALL)
  31. @JoinColumn(name="EMPLOYEE_ID")
  32. privateSet<AccountEntity>accounts;
  33. publicIntegergetEmployeeId(){
  34. returnemployeeId;
  35. }
  36. publicvoidsetEmployeeId(IntegeremployeeId){
  37. this.employeeId=employeeId;
  38. }
  39. publicStringgetEmail(){
  40. returnemail;
  41. }
  42. publicvoidsetEmail(Stringemail){
  43. this.email=email;
  44. }
  45. publicStringgetFirstName(){
  46. returnfirstName;
  47. }
  48. publicvoidsetFirstName(StringfirstName){
  49. this.firstName=firstName;
  50. }
  51. publicStringgetLastName(){
  52. returnlastName;
  53. }
  54. publicvoidsetLastName(StringlastName){
  55. this.lastName=lastName;
  56. }
  57. publicSet<AccountEntity>getAccounts(){
  58. returnaccounts;
  59. }
  60. publicvoidsetAccounts(Set<AccountEntity>accounts){
  61. this.accounts=accounts;
  62. }
  63. }

Account实体
[java] view plain copy
  1. packagehibernate.test.oneToMany.foreignKeyAsso;
  2. importjava.io.Serializable;
  3. importjavax.persistence.Column;
  4. importjavax.persistence.Entity;
  5. importjavax.persistence.GeneratedValue;
  6. importjavax.persistence.GenerationType;
  7. importjavax.persistence.Id;
  8. importjavax.persistence.ManyToOne;
  9. importjavax.persistence.Table;
  10. importjavax.persistence.UniqueConstraint;
  11. @Entity(name="ForeignKeyAssoAccountEntity")
  12. @Table(name="ACCOUNT",uniqueConstraints={
  13. @UniqueConstraint(columnNames="ID")})
  14. publicclassAccountEntityimplementsSerializable
  15. {
  16. privatestaticfinallongserialVersionUID=-6790693372846798580L;
  17. @Id
  18. @GeneratedValue(strategy=GenerationType.IDENTITY)
  19. @Column(name="ID",unique=true,nullable=false)
  20. privateIntegeraccountId;
  21. @Column(name="ACC_NUMBER",unique=true,nullable=false,length=100)
  22. privateStringaccountNumber;
  23. @ManyToOne
  24. privateEmployeeEntityemployee;
  25. publicIntegergetAccountId(){
  26. returnaccountId;
  27. }
  28. publicvoidsetAccountId(IntegeraccountId){
  29. this.accountId=accountId;
  30. }
  31. publicStringgetAccountNumber(){
  32. returnaccountNumber;
  33. }
  34. publicvoidsetAccountNumber(StringaccountNumber){
  35. this.accountNumber=accountNumber;
  36. }
  37. publicEmployeeEntitygetEmployee(){
  38. returnemployee;
  39. }
  40. publicvoidsetEmployee(EmployeeEntityemployee){
  41. this.employee=employee;
  42. }
  43. }

测试代码
[java] view plain copy
  1. packagehibernate.test.oneToMany;
  2. importhibernate.test.HibernateUtil;
  3. importhibernate.test.oneToMany.foreignKeyAsso.AccountEntity;
  4. importhibernate.test.oneToMany.foreignKeyAsso.EmployeeEntity;
  5. importjava.util.HashSet;
  6. importjava.util.Set;
  7. importorg.hibernate.Session;
  8. publicclassTestForeignKeyAssociation
  9. {
  10. publicstaticvoidmain(String[]args)
  11. {
  12. Sessionsession=HibernateUtil.getSessionFactory().openSession();
  13. session.beginTransaction();
  14. AccountEntityaccount1=newAccountEntity();
  15. account1.setAccountNumber("Accountdetail1");
  16. AccountEntityaccount2=newAccountEntity();
  17. account2.setAccountNumber("Accountdetail2");
  18. AccountEntityaccount3=newAccountEntity();
  19. account3.setAccountNumber("Accountdetail3");
  20. //AddnewEmployeeobject
  21. EmployeeEntityfirstEmployee=newEmployeeEntity();
  22. firstEmployee.setEmail("demo-user-first@mail.com");
  23. firstEmployee.setFirstName("demo-one");
  24. firstEmployee.setLastName("user-one");
  25. EmployeeEntitysecondEmployee=newEmployeeEntity();
  26. secondEmployee.setEmail("demo-user-second@mail.com");
  27. secondEmployee.setFirstName("demo-two");
  28. secondEmployee.setLastName("user-two");
  29. Set<AccountEntity>accountsOfFirstEmployee=newHashSet<AccountEntity>();
  30. accountsOfFirstEmployee.add(account1);
  31. accountsOfFirstEmployee.add(account2);
  32. Set<AccountEntity>accountsOfSecondEmployee=newHashSet<AccountEntity>();
  33. accountsOfSecondEmployee.add(account3);
  34. firstEmployee.setAccounts(accountsOfFirstEmployee);
  35. secondEmployee.setAccounts(accountsOfSecondEmployee);
  36. //SaveEmployee
  37. session.save(firstEmployee);
  38. session.save(secondEmployee);
  39. session.getTransaction().commit();
  40. HibernateUtil.shutdown();
  41. }
  42. }
  43. Output:
  44. Hibernate:insertintoEmployee(EMAIL,FIRST_NAME,LAST_NAME)values(?,?,?)
  45. Hibernate:insertintoACCOUNT(ACC_NUMBER,employee_ID)values(?,?)
  46. Hibernate:insertintoACCOUNT(ACC_NUMBER,employee_ID)values(?,?)
  47. Hibernate:insertintoEmployee(EMAIL,FIRST_NAME,LAST_NAME)values(?,?,?)
  48. Hibernate:insertintoACCOUNT(ACC_NUMBER,employee_ID)values(?,?)
  49. Hibernate:updateACCOUNTsetEMPLOYEE_ID=?whereID=?
  50. Hibernate:updateACCOUNTsetEMPLOYEE_ID=?whereID=?
  51. Hibernate:updateACCOUNTsetEMPLOYEE_ID=?whereID=?

使用关联表

这种方式使用关联表存储两个实体间的关系@JoinTable注解是用来建立这种关系的,先来看一下数据库模式

EMPLOYEE实体
[java] view plain copy
  1. packagehibernate.test.oneToMany.joinTable;
  2. importjava.io.Serializable;
  3. importjava.util.Set;
  4. importjavax.persistence.CascadeType;
  5. importjavax.persistence.Column;
  6. importjavax.persistence.Entity;
  7. importjavax.persistence.GeneratedValue;
  8. importjavax.persistence.GenerationType;
  9. importjavax.persistence.Id;
  10. importjavax.persistence.JoinColumn;
  11. importjavax.persistence.JoinTable;
  12. importjavax.persistence.OneToMany;
  13. importjavax.persistence.Table;
  14. importjavax.persistence.UniqueConstraint;
  15. @Entity(name="JoinTableEmployeeEntity")
  16. @Table(name="Employee",uniqueConstraints={
  17. @UniqueConstraint(columnNames="ID"),
  18. @UniqueConstraint(columnNames="EMAIL")})
  19. publicclassEmployeeEntityimplementsSerializable
  20. {
  21. privatestaticfinallongserialVersionUID=-1798070786993154676L;
  22. @Id
  23. @GeneratedValue(strategy=GenerationType.IDENTITY)
  24. @Column(name="ID",unique=true,nullable=false)
  25. privateIntegeremployeeId;
  26. @Column(name="EMAIL",unique=true,nullable=false,length=100)
  27. privateStringemail;
  28. @Column(name="FIRST_NAME",unique=false,nullable=false,length=100)
  29. privateStringfirstName;
  30. @Column(name="LAST_NAME",unique=false,nullable=false,length=100)
  31. privateStringlastName;
  32. @OneToMany(cascade=CascadeType.ALL)
  33. @JoinTable(name="EMPLOYEE_ACCOUNT",joinColumns={@JoinColumn(name="EMPLOYEE_ID",referencedColumnName="ID")}
  34. ,inverseJoinColumns={@JoinColumn(name="ACCOUNT_ID",referencedColumnName="ID")})
  35. privateSet<AccountEntity>accounts;
  36. publicIntegergetEmployeeId(){
  37. returnemployeeId;
  38. }
  39. publicvoidsetEmployeeId(IntegeremployeeId){
  40. this.employeeId=employeeId;
  41. }
  42. publicStringgetEmail(){
  43. returnemail;
  44. }
  45. publicvoidsetEmail(Stringemail){
  46. this.email=email;
  47. }
  48. publicStringgetFirstName(){
  49. returnfirstName;
  50. }
  51. publicvoidsetFirstName(StringfirstName){
  52. this.firstName=firstName;
  53. }
  54. publicStringgetLastName(){
  55. returnlastName;
  56. }
  57. publicvoidsetLastName(StringlastName){
  58. this.lastName=lastName;
  59. }
  60. publicSet<AccountEntity>getAccounts(){
  61. returnaccounts;
  62. }
  63. publicvoidsetAccounts(Set<AccountEntity>accounts){
  64. this.accounts=accounts;
  65. }
  66. }

Account实体
[java] view plain copy
  1. packagehibernate.test.oneToMany.joinTable;
  2. importjava.io.Serializable;
  3. importjavax.persistence.Column;
  4. importjavax.persistence.Entity;
  5. importjavax.persistence.GeneratedValue;
  6. importjavax.persistence.GenerationType;
  7. importjavax.persistence.Id;
  8. importjavax.persistence.Table;
  9. importjavax.persistence.UniqueConstraint;
  10. @Entity(name="JoinTableAccountEntity")
  11. @Table(name="ACCOUNT",uniqueConstraints={
  12. @UniqueConstraint(columnNames="ID")})
  13. publicclassAccountEntityimplementsSerializable
  14. {
  15. privatestaticfinallongserialVersionUID=-6790693372846798580L;
  16. @Id
  17. @GeneratedValue(strategy=GenerationType.IDENTITY)
  18. @Column(name="ID",unique=true,nullable=false)
  19. privateIntegeraccountId;
  20. @Column(name="ACC_NUMBER",unique=true,nullable=false,length=100)
  21. privateStringaccountNumber;
  22. publicIntegergetAccountId(){
  23. returnaccountId;
  24. }
  25. publicvoidsetAccountId(IntegeraccountId){
  26. this.accountId=accountId;
  27. }
  28. publicStringgetAccountNumber(){
  29. returnaccountNumber;
  30. }
  31. publicvoidsetAccountNumber(StringaccountNumber){
  32. this.accountNumber=accountNumber;
  33. }
  34. }

在配置文件中配置实体,我们已经有了两个在运行时的实体,我们必须在配置文件中增加他们。请注意只有一个集合实体可以在配置文件中配置,否则会有意外的情况发生
[java] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <!DOCTYPEhibernate-configurationPUBLIC
  3. "-//Hibernate/HibernateConfigurationDTD3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatetest</property>
  9. <propertyname="hibernate.connection.password">XXXXXX</property>
  10. <propertyname="hibernate.connection.username">root</property>
  11. <propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  12. <propertyname="show_sql">true</property>
  13. <propertyname="hbm2ddl.auto">create</property>
  14. <mappingclas="hibernate.test.oneToMany.foreignKeyAsso.AccountEntity"></mapping>
  15. <mappingclas="hibernate.test.oneToMany.foreignKeyAsso.EmployeeEntity"></mapping>
  16. </session-factory>
  17. </hibernate-configuration>

测试代码:
[java] view plain copy
    1. packagehibernate.test.oneToMany;
    2. importhibernate.test.HibernateUtil;
    3. importhibernate.test.oneToMany.joinTable.AccountEntity;
    4. importhibernate.test.oneToMany.joinTable.EmployeeEntity;
    5. importjava.util.HashSet;
    6. importjava.util.Set;
    7. importorg.hibernate.Session;
    8. publicclassTestJoinTable
    9. {
    10. publicstaticvoidmain(String[]args)
    11. {
    12. Sessionsession=HibernateUtil.getSessionFactory().openSession();
    13. session.beginTransaction();
    14. AccountEntityaccount1=newAccountEntity();
    15. account1.setAccountNumber("123-345-65454");
    16. AccountEntityaccount2=newAccountEntity();
    17. account2.setAccountNumber("123-345-6542222");
    18. //AddnewEmployeeobject
    19. EmployeeEntityemp=newEmployeeEntity();
    20. emp.setEmail("demo-user@mail.com");
    21. emp.setFirstName("demo");
    22. emp.setLastName("user");
    23. Set<AccountEntity>accounts=newHashSet<AccountEntity>();
    24. accounts.add(account1);
    25. accounts.add(account2);
    26. emp.setAccounts(accounts);
    27. //SaveEmployee
    28. session.save(emp);
我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved