Java知识点11 Hibernate多对多单向关联(Annotation+XML实现)

1、Annotation 注解版

1.1、应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联的多对多模式

1.2、创建Teacher类和Student类

 1 package com.shore.model;
 2
 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
 9 /**
10  * @author DSHORE/2019-9-22
11  * 多对多,单向关联(注解版)
12  */
13 @Entity
14 @Table(name="anno_teacher")
15 public class Teacher {
16     private Integer id;
17     private String name;
18     private Integer age;
19
20     @Id
21     @GeneratedValue(strategy=GenerationType.IDENTITY)
22     public Integer getId() {
23         return id;
24     }
25     public void setId(Integer id) {
26         this.id = id;
27     }
28     public String getName() {
29         return name;
30     }
31     public void setName(String name) {
32         this.name = name;
33     }
34     public Integer getAge() {
35         return age;
36     }
37     public void setAge(Integer age) {
38         this.age = age;
39     }
40 }

Student类

 1 package com.shore.model;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6 import javax.persistence.Entity;
 7 import javax.persistence.GeneratedValue;
 8 import javax.persistence.GenerationType;
 9 import javax.persistence.Id;
10 import javax.persistence.JoinColumn;
11 import javax.persistence.JoinTable;
12 import javax.persistence.ManyToMany;
13 import javax.persistence.Table;
14
15 /**
16  * @author DSHORE/2019-9-22
17  * 多对一,单向关联(注解版)
18  */
19 @Entity
20 @Table(name="anno_student")
21 public class Student {
22     private Integer id;
23     private String number;
24     private Float sum;
25     private Set<Teacher> teachers = new HashSet<Teacher>();
26
27     @Id
28     @GeneratedValue(strategy=GenerationType.IDENTITY)
29     public Integer getId() {
30         return id;
31     }
32     public void setId(Integer id) {
33         this.id = id;
34     }
35     public String getNumber() {
36         return number;
37     }
38     public void setNumber(String number) {
39         this.number = number;
40     }
41     public Float getSum() {
42         return sum;
43     }
44     public void setSum(Float sum) {
45         this.sum = sum;
46     }
47
48     /**
49      * name:中间表的表名
50      * joinColumns:当前对象所对应的id
51      * inverseJoinColumns:对方对象所对应的id
52      */
53     @ManyToMany
54     @JoinTable(name="anno_student_teacher",
55                [email protected](name="student_id"),
56                [email protected](name="teacher_id"))
57     public Set<Teacher> getTeachers() {
58         return teachers;
59     }
60     public void setTeachers(Set<Teacher> teachers) {
61         this.teachers = teachers;
62     }
63 }

1.3、创建hibernate.cfg.xml核心配置文件

 1 <?xml version=‘1.0‘ encoding=‘utf-8‘?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5
 6 <hibernate-configuration>
 7     <session-factory>
 8         <!-- Database connection settings -->
 9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
10         <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
11         <property name="connection.username">root</property>
12         <property name="connection.password">123456</property>
13
14         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
15         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
16         <property name="show_sql">true</property>
17         <property name="hbm2ddl.auto">create</property>
18
19         <mapping class="com.shore.model.Teacher" />
20         <mapping class="com.shore.model.Student" />
21     </session-factory>
22 </hibernate-configuration>

1.4、开始测试

 1 package com.shore.test;
 2
 3 import org.hibernate.cfg.AnnotationConfiguration;
 4 import org.hibernate.tool.hbm2ddl.SchemaExport;
 5 import org.junit.Test;
 6
 7 /**
 8  * @author DSHORE/2019-9-22
 9  *
10  */
11 public class AnnotationTest {
12     @Test
13     public void test() {//简单测试,只创建表,不插入数据
14         new SchemaExport(new AnnotationConfiguration().configure()).create(
15                 false, true);
16     }
17 }

测试结果图:

      

    

2、XML版 的实现

2.1、创建Teacher类和Student类

 1 package com.shore.model;
 2
 3 /**
 4  * @author DSHORE/2019-9-22
 5  * 多对多,单向关联(xml版)
 6  */
 7 public class Teacher {
 8     private Integer id;
 9     private String name;
10     private Integer age;
11
12     public Integer getId() {
13         return id;
14     }
15     public void setId(Integer id) {
16         this.id = id;
17     }
18     public String getName() {
19         return name;
20     }
21     public void setName(String name) {
22         this.name = name;
23     }
24     public Integer getAge() {
25         return age;
26     }
27     public void setAge(Integer age) {
28         this.age = age;
29     }
30 }

Student类

 1 package com.shore.model;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6 /**
 7  * @author DSHORE/2019-9-22
 8  * 多对一,单向关联(xml版)
 9  */
10 public class Student {
11     private Integer id;
12     private String number;
13     private Float sum;
14     private Set<Teacher> teachers = new HashSet<Teacher>();
15
16     public Integer getId() {
17         return id;
18     }
19     public void setId(Integer id) {
20         this.id = id;
21     }
22     public String getNumber() {
23         return number;
24     }
25     public void setNumber(String number) {
26         this.number = number;
27     }
28     public Float getSum() {
29         return sum;
30     }
31     public void setSum(Float sum) {
32         this.sum = sum;
33     }
34     public Set<Teacher> getTeachers() {
35         return teachers;
36     }
37     public void setTeachers(Set<Teacher> teachers) {
38         this.teachers = teachers;
39     }
40 }

2.2、创建 Teacher.hbm.xml 配置文件和 Student.hbm.xml 配置文件

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5
 6 <hibernate-mapping package="com.shore.model">
 7     <class name="Teacher" table="xml_teacher">
 8         <id name="id">
 9             <generator class="native"/>
10         </id>
11         <property name="name" type="java.lang.String"/>
12         <property name="age" type="java.lang.Integer"/>
13     </class>
14 </hibernate-mapping>

Student.hbm.xml 配置文件

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5
 6 <hibernate-mapping package="com.shore.model">
 7     <class name="Student" table="xml_student">
 8         <id name="id">
 9             <generator class="native"/>
10         </id>
11         <property name="number" type="java.lang.String"/>
12         <property name="sum" type="java.lang.Float"/>
13
14         <set name="teachers" table="xml_student_teacher">
15             <key column="student_id"/> <!-- 当前对象所对应的id -->
16             <many-to-many class="com.shore.model.Teacher" column="teacher_id"/> <!-- 对方对象所对应的id -->
17         </set>
18     </class>
19 </hibernate-mapping>

2.3、创建hibernate.cfg.xml 核心配置文件

 1 <?xml version=‘1.0‘ encoding=‘utf-8‘?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5
 6 <hibernate-configuration>
 7     <session-factory>
 8         <!-- Database connection settings -->
 9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
10         <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
11         <property name="connection.username">root</property>
12         <property name="connection.password">123456</property>
13
14         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
15         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
16         <property name="show_sql">true</property>
17         <property name="hbm2ddl.auto">create</property>
18
19         <!-- <mapping class="com.shore.model.Teacher" />
20         <mapping class="com.shore.model.Student" /> -->
21         <mapping resource="com/shore/model/Teacher.hbm.xml" />
22         <mapping resource="com/shore/model/Student.hbm.xml" />
23     </session-factory>
24 </hibernate-configuration>

2.4、开始测试

 1 package com.shore.test;
 2
 3 import org.hibernate.cfg.Configuration;
 4 import org.hibernate.tool.hbm2ddl.SchemaExport;
 5 import org.junit.Test;
 6
 7 /**
 8  * @author DSHORE/2019-9-22
 9  *
10  */
11 public class XMLTest {
12     @Test
13     public void test() {//简单测试,只创建表,不插入数据
14                     //xml版,这里用的是Configuration()方法。
15         new SchemaExport(new Configuration().configure()).create(
16                 false, true);
17     }
18 }

测试结果图:

    

    


原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/11568536.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

原文地址:https://www.cnblogs.com/dshore123/p/11568536.html

时间: 2024-10-23 05:43:50

Java知识点11 Hibernate多对多单向关联(Annotation+XML实现)的相关文章

hibernate多对一单向关联注解方式

多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(n

hibernate多对一单向关联

注解: 使用注解:

Hibernate中用注解配置一对多双向关联和多对一单向关联

Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解开发包 配置持久化类 配置关联关系 下面我们先从多对一单向关联关系讲起,多对一单向关联就是在多的一方植入一的一方的主键作为外键,下面我们先进行初始配置, 在配置的过程中我们会遇到一个问题  就是无论用load还是get都不会出现延迟加载,那么我们应该如何设置为要延迟加载,这样做的好处是可以在用的时候

hibernate的映射之三(多对多单向关联)

Many-to-Many 多对多的映射可以使用一组Java集合不包含任何重复的元素来实现.我们已经看到了Hibernate如何设置映射集合. 集(SET)被映射到与映射表中<set>元素,并以java.util.HashSet初始化.您可以使用Set集合在类中时,集合不需要重复的元素. 在现实生活中多对多的例子挺多的. 例如:学生与老师,订单与商品等 下面我就以员工和项目来做例子,一个员工可以做多个项目,一个项目可以被多个员工做. 1.准备JavaBean 项目·实体·类 public cla

Hibernate之关于多对多单向关联映射

[Hibernate]之关于多对多单向关联映射 老师和学生,最典型的多对多关联, Teacher和Student.所谓单向意思就是说.老师知道自己的教的是哪些学生而学生不知道是哪些老师教. 也能够这么说,在查询的时候,通过老师能够级联查询出学生,可是通过学生不能够级联查询出老师. 而多对多最麻烦的是怎么自己定义我们中间表的,表名和列名,这个是重要的! Annotations配置 @Entity @Table(name="t_teacher") publicclass Teacher {

hibernate之多对一单向关联

一个工作组(Group)里可以有多个用户(User),一个User只属于一个Group,这是典型的多对一的关系.在多对一的关系中正确的数据库设计是在多的这方(在这里是User这方)加一个Group的外键.如果数据库设计的与之相反就会产生冗余,请看下面这个例子: 友情提示:这是错误的设计方法: GroupId GroupName UserId 1 Group_1 1 1 Group_1 2 UserId UserName 1 moluo 2 xingzhe 这样在一的这方(也就是Group这方)设

hibernate之关于多对一单向关联映射

[Hibernate]之关于多对一单向关联映射 在项目的开发中多对一的单向关联映射是最常见的,关联映射!这个着重详细讲解一下! 例如,我们现在一个组(Group)和人(Person) (Person表) id name 1 张三 2 李四 (Group表) id name p_id 1 财务组 1 2 财务组 2 由上表我们发现,是不是出现数据的重复?财务组在重复! 所以,在多对一的单向映射中,我们通常是在多的一方加上外键来关联少的一方. 那么在这个关系中(Group)是少的一方,(Person

Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate映射文件中主键自增规则.Hibernate实例状态(瞬时状态.持久化状态.托管状态).Hibernate初始化类获取session等方法 下图内容保存数据过程 下面内容保存数据顺序.查询数据方法 get().load()和延迟加载.删除数据 下图内容删除对象顺序.修改数据顺序 下面内容关联关系映射.

【Hibernate步步为营】--单向关联一对一映射(一)

上篇文章对多对一的关联映射做了详细的分析,它在实现上可以有两种方式,并且这两种方式实现也很简单,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系,这种映射关系既是对象模型中的聚合关系.接下来继续讨论关联映射. 一.唯一外键 唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示: 上图的两个实体表,分别为人和身份证,很明显的一个人对应着一个身份证.身份证作为