Hibernate关联关系配置

蔚落 2022-03-01 13:54 349阅读 0赞

1.单向多对一配置
基础配置

  1. <!-- Database connection settings -->
  2. <property name="connection.driver_class">oracle.jdbc.driver.jdbcDriver</property>
  3. <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
  4. <property name="connection.username">scott</property>
  5. <property name="connection.password">tiger</property>
  6. <!-- SQL dialect -->
  7. <property name="dialect">org.hibernate.dialect.OracleDialect</property>
  8. <!-- Echo all executed SQL to stdout -->
  9. <property name="format_sql">true</property>
  10. <property name="show_sql">true</property>
  11. <!-- Drop and re-create the database schema on startup -->
  12. <property name="hbm2ddl.auto">update</property>
  13. <mapping name="hbm/Student.hbm.xml"></mapping>
  14. <mapping name="hbm/Teacher.hbm.xml"></mapping>

One 配置对象

  1. clas Student
  2. private int sid;
  3. private String sname;
  4. private Teacher teacher;

Many

  1. class Student
  2. private int tid;
  3. private String tname;
  4. private Student student;

Mapping配置文件

many:

  1. <!-- 参考文档 《Hibernate Reference Documentation》 for 3.5.6-Final -->
  2. <hibernate-mapping package="com.hxzy.manyone">
  3. <!-- 类名 -->
  4. <class name="com.hxzy.manytoone.entity.Teacher" table="teacher">
  5. <!-- 生成id主键 -->
  6. <id name="tid" column="tid">
  7. <generator class="sequence"><!-- 生成序列 -->
  8. <param name="sequence">
  9. seq_teacher
  10. </param>
  11. </generator>
  12. </id>
  13. <!-- 属性name -->
  14. <property name="name" not-null="true"></property>
  15. <many-to-one name="Student" class="com.hxzy.manytoone.entity.Student" column="s_id" cascade="save-update">
  16. </many-to-one>
  17. <!-- column(可选):外键字段的名称。也可以通过嵌套的 <column> 指定 -->
  18. <!-- class(可选 — 默认是通过反射得到的属性类型):被关联的类的名字。 -->
  19. <!--cascade(级联)(可选)表明操作是否从父对象级联到被关联的对象 -->
  20. </class>
  21. </hibernate-mapping>

one:

  1. <hibernate-mapping package="com.hxzy.manyone">
  2. <class name="com.hxzy.manytoone.entity.Student" table="student">
  3. <id name="sid" column="sid">
  4. <generator class="sequence">
  5. <param name="sequence">
  6. seq_student
  7. </param>
  8. </generator>
  9. </id>
  10. <property name="name" not-null="true"></property>
  11. </class>
  12. </hibernate-mapping>

dao层

  1. Session session = null;
  2. /**
  3. * 获取session
  4. * */
  5. public Session getSession() {
  6. Configuration cfg = new Configuration().configure();
  7. SessionFactory sessionFactory= cfg.buildSessionFactory();
  8. Session session = sessionFactory.openSession();
  9. return session;
  10. }
  11. public void addTeacher(Teacher teacher) {
  12. session = getSession();
  13. Transaction ts = session.beginTransaction();
  14. try {
  15. session.save(teacher);//存入老湿信息
  16. ts.commit();//提交事务
  17. }catch(Exception e) {
  18. e.printStackTrace();
  19. ts.rollback();//报错则回滚
  20. }finally {
  21. session.close();
  22. }
  23. }
  24. 测试代码
  25. @Test
  26. public void test1() {
  27. DaoImpl daoImpl = new DaoImpl();
  28. Teacher t1 = new Teacher();
  29. Teacher t2 = new Teacher();
  30. Student s1 = new Student();
  31. s1.setSname("gz1");
  32. t1.setTname("gt1");
  33. t1.setStudent(s1);
  34. t2.setTname("gt2");
  35. t2.setStudent(s1);
  36. daoImpl.addObject(s1);
  37. daoImpl.addObject(t1);
  38. daoImpl.addObject(t2);
  39. }

创建的库
百度百度百度
百度百度百度
百度百度百度
框架在数据库中的操作
create table Teacher(Id bigint not null primary key,sid bigint not null )//在teacher中创建主键tid,外键sid并和student中的sid关联
create table Student ( sid bigint not null primary key )//创建sid主键
2.单向一对一配置
基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关
联中的外键字段具有唯一性约束。
xml中其他不变仅在多对一节点添加unique=“true”

  1. <!-- 单向一对一关联 -->
  2. <many-to-one name="student"
  3. class="com.hxzy.manyone.entity.Student" unique="true"
  4. column="stu_id" not-null="true" />

3.基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用。
对于这种关联关系最好使用连接表。

4.使用连接表的一对多
基于连接表的单向一对多关联 应该优先被采用。请注意,通过指定unique=“true”,我们可以把多
样性从多对多改变为一对多。

  1. <!--many-->
  2. student:
  3. <class name="com.hxzy.manymany.entity.Student" table="student">
  4. <id name="sid" column="sid">
  5. <generator class="sequence">
  6. <param name="seuqence">seq_student</param>
  7. </generator>
  8. </id>
  9. <property name="sname" not-null="true"></property>
  10. </class>
  11. <!-- one-->
  12. teacher:
  13. <!-- 类,id,name -->
  14. <class name="com.hxzy.manymany.entity.Teacher" table="teacher">
  15. <id name="tid" column="tid">
  16. <generator class="sequence">
  17. <param name="sequence">seq_teacher</param>
  18. </generator>
  19. </id>
  20. <property name="tname" not-null="true"></property>
  21. <!-- 基于连接表的单向一对多 -->
  22. <set name="set" table="teacher_student"><!-- 新表-->
  23. <key column="tid" />
  24. <many-to-many column="sid" unique="true"
  25. class="com.hxzy.manymany.entity.Student" />
  26. </set>
  27. </class>

teacher类:

  1. private int tid;
  2. private String tname;
  3. private Set<Student> set = new HashSet<Student>();

student类

  1. private int sid;
  2. private String sname;
  3. private Teacher teacher;

test:

  1. @Test
  2. public void test1() {
  3. DaoImpl daoImpl = new DaoImpl();
  4. Teacher t1 = new Teacher();
  5. Set<Student> set = new HashSet<Student>();
  6. Student s1 = new Student();
  7. Student s2 = new Student();
  8. s1.setSname("gz1");
  9. s2.setSname("gz2");
  10. set.add(s1);
  11. set.add(s2);
  12. t1.setTname("gt1");
  13. t1.setSet(set);
  14. daoImpl.addObject(s1);
  15. daoImpl.addObject(s2);
  16. daoImpl.addObject(t1);
  17. }

最终形成的数据库结构
百度百度百度述百度百度百度
百度百度百度
百度百度百度
可以看到,(tid,sid)作为连接表的主键,sid和tid为连接表的外键,从而将student的主键sid化作了teacher的外键

.多对多
单向多对多

  1. <!-- 类名 -->
  2. <class name="com.hxzy.manyone.entity.Teacher" table="teacher">
  3. <!-- 生成id主键 -->
  4. <id name="id" column="id">
  5. <generator class="sequence">
  6. <!-- 生成序列 -->
  7. <param name="sequence">
  8. seq_teacher
  9. </param>
  10. </generator>
  11. </id>
  12. <!-- 属性name -->
  13. <property name="name" not-null="true"></property>
  14. <!--生成新表,将id中stu_id关联 -->
  15. <set name="Student" table="teacher_sutdent">
  16. <key column="id" />
  17. <many-to-many column="stu_id"
  18. class="com.hxzy.manyone.entity.Student" />
  19. </set>
  20. </class>

测试代码

  1. @Test
  2. public void Test1() {
  3. DaoImpl daoImpl = new DaoImpl();
  4. Student student1 = new Student();
  5. Student student2 = new Student();
  6. Teacher teacher1 = new Teacher();
  7. // Teacher teacher2 = new Teacher();
  8. Set<Student> set1 = new HashSet<Student>();
  9. student1.setName("a");
  10. student2.setName("b");
  11. teacher1.setName("gz");
  12. // teacher2.setName("gz1");
  13. set1.add(student1);
  14. set1.add(student2);
  15. teacher1.setSet(set1);
  16. daoImpl.addObject(student1);
  17. daoImpl.addObject(student2);
  18. daoImpl.addObject(teacher1);
  19. // daoImpl.addTeacher(teacher2);

效果如下
生成一个新表t_s,其主键为stu_id,外键为(id(来自teacher),stu_id),与student中的外键stu_id关联,与teacher中的外键stu_id关联
百度百度百度
百度百度百度
teacher表
百度百度百度
百度百度百度
student表
百度百度百度
百度百度百度
5.双向关联
双向多对一关联 是最常见的关联关系

  1. <class name="com.hxzy.manymany.entity.Teacher" table="teacher">
  2. <id name="tid" column="tid">
  3. <generator class="sequence">
  4. <param name="sequence">seq_teacher</param>
  5. </generator>
  6. </id>
  7. <property name="tname" not-null="true"></property>
  8. <!-- 基于外键的双向多对一 many -->
  9. <many-to-one name="student"
  10. class="com.hxzy.manymany.entity.Student" column="sid"
  11. cascade="save-update" />
  12. </class>
  13. <class name="com.hxzy.manymany.entity.Student" table="student">
  14. <id name="sid" column="sid">
  15. <generator class="sequence">
  16. <param name="seuqence">seq_student</param>
  17. </generator>
  18. </id>
  19. <property name="sname" not-null="true"></property>
  20. <!-- 基于外键的双向多对一 :one -->
  21. <set name="set" inverse="true">
  22. <key column="sid" />
  23. <one-to-many class="com.hxzy.manymany.entity.Teacher" />
  24. </set>
  25. </class>

Class Many:

  1. public class Teacher {
  2. private int tid;
  3. private String tname;
  4. private Student student;

Class One:

  1. public class Student {
  2. private int sid;
  3. private String sname;
  4. Set<Teacher> set = new HashSet<Teacher>();

Test:

  1. public class Test1 {
  2. @Test
  3. public void test1() {
  4. DaoImpl daoImpl = new DaoImpl();
  5. Teacher t1 = new Teacher();
  6. Teacher t2 = new Teacher();
  7. Set<Teacher> set1 = new HashSet<Teacher>();
  8. Student s1 = new Student();
  9. t1.setTname("gt1");
  10. t2.setTname("gt2");
  11. set1.add(t1);
  12. set1.add(t2);
  13. s1.setSname("gz1");
  14. s1.setSet(set1);
  15. daoImpl.addObject(t1);
  16. daoImpl.addObject(t2);
  17. daoImpl.addObject(s1);
  18. }
  19. }

生成的数据库结构
百度百度百度
百度百度百度
双向一对一关联基于外键关联也很常见

  1. teacher
  2. <class name="com.hxzy.manymany.entity.Teacher" table="teacher">
  3. <id name="tid" column="tid">
  4. <generator class="sequence">
  5. <param name="sequence">seq_teacher</param>
  6. </generator>
  7. </id>
  8. <property name="tname" not-null="true"></property>
  9. <!-- 基于外键关联的双向一对一关联 -->
  10. <many-to-one name="student" column="sid"
  11. class="com.hxzy.manymany.entity.Student" unique="true"
  12. not-null="true" />
  13. </class>
  14. student:
  15. <class name="com.hxzy.manymany.entity.Student" table="student">
  16. <id name="sid" column="sid">
  17. <generator class="sequence">
  18. <param name="seuqence">seq_student</param>
  19. </generator>
  20. </id>
  21. <property name="sname" not-null="true"></property>
  22. <!-- 基于外键的双向一对一 :one -->
  23. <one-to-one nam="teacher" property-ref="student"
  24. class="com.hxzy.manymany.entity.Teacher" />
  25. </class>
  26. teacher:
  27. public class Teacher {
  28. private int tid;
  29. private String tname;
  30. private Student student;
  31. }
  32. student:
  33. public class Student {
  34. private int sid;
  35. private String sname;
  36. private Teacher teacher;
  37. test:
  38. @Test
  39. public void test1() {
  40. DaoImpl daoImpl = new DaoImpl();
  41. Teacher t1 = new Teacher();
  42. Teacher t2 = new Teacher();
  43. Student s1 = new Student();
  44. Student s2 = new Student();
  45. t1.setTname("gt1");
  46. t2.setTname("gt2");
  47. s1.setSname("gz1");
  48. s2.setSname("gz2");
  49. t1.setStudent(s1);
  50. t2.setStudent(s2);
  51. daoImpl.addObject(s1);
  52. daoImpl.addObject(s2);
  53. daoImpl.addObject(t1);
  54. daoImpl.addObject(t2);
  55. }

基于主键关联的一对一关联则需要使用特定的id生成器

  1. teachet:
  2. <class name="com.hxzy.manymany.entity.Teacher" table="teacher">
  3. <id name="tid" column="tid">
  4. <generator class="sequence">
  5. <param name="sequence">seq_teacher</param>
  6. </generator>
  7. </id>
  8. <property name="tname" not-null="true"></property>
  9. <!-- 基于主键关联的一对一关联需要使用特定的id生成器 -->
  10. <one-to-one name="student"
  11. class="com.hxzy.manymany.entity.Student" />
  12. </class>
  13. student:
  14. <class name="com.hxzy.manymany.entity.Student" table="student">
  15. <!-- 基于主键关联的一对一关联需要使用特定的id生成器 -->
  16. <id name="sid" column="tid">
  17. <generator class="foreign">
  18. <param name="property">teacher</param>
  19. </generator>
  20. </id>
  21. <property name="sname" not-null="true"></property>
  22. <!-- 基于主键关联的一对一关联需要使用特定的id生成器 -->
  23. <one-to-one name="teacher"
  24. class="com.hxzy.manymany.entity.Teacher" constrained="true" />
  25. </class>

test:

  1. @Test
  2. public void test1() {
  3. DaoImpl daoImpl = new DaoImpl();
  4. Teacher t1 = new Teacher();
  5. Teacher t2 = new Teacher();
  6. Student s1 = new Student();
  7. Student s2 = new Student();
  8. t1.setTname("gt1");
  9. t2.setTname("gt2");
  10. s1.setSname("gz1");
  11. s2.setSname("gz2");
  12. s1.setTeacher(t1);//引用他人主键的一方中set他人属性
  13. s2.setTeacher(t2);
  14. daoImpl.addObject(t1);
  15. daoImpl.addObject(t2);
  16. daoImpl.addObject(s1);
  17. daoImpl.addObject(s2);
  18. }

生成的数据库如下:
百度百度百度
百度百度百度
百度百度百度

发表评论

表情:
评论列表 (有 0 条评论,349人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hibernate annotation 关联关系

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置

    相关 Hibernate的一对一关联关系

      Hibernate的一对一关联关系,分为基于外键的一对一关联关系和基于主键的一对一关联关系。在这篇文章中,我们以部门和部门经理的例子来说明,一个部门对应唯一一个部门经理,一

    相关 Hibernate 03-配置关联关系映射

    一、了解关联关系 类与类之间最普遍的关系就是关联关系,并且关联是有方向的。以部门(Dept)和员工(Emp)类为例,一个部门下有多个员工,而一个员工只能属于一个部门