天天看点

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

多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例。

首先我们还是先看Annotations配置!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<code>@Entity</code>

<code>@Table</code><code>(name=</code><code>"t_student"</code><code>)</code>

<code>public</code> <code>class</code> <code>Student {</code>

<code>    </code><code>private</code> <code>Integer id;</code>

<code>    </code><code>private</code> <code>String name;</code>

<code>    </code><code>private</code> <code>Integer age;</code>

<code>    </code><code>private</code> <code>Set&lt;Teacher&gt; teachers=</code><code>new</code> <code>HashSet&lt;Teacher&gt;();</code><code>//指定从学生也可以映射老师</code>

<code>    </code> 

<code>    </code><code>@ManyToMany</code><code>(mappedBy=</code><code>"students"</code><code>)</code>

<code>    </code><code>public</code> <code>Set&lt;Teacher&gt;getTeachers() {</code>

<code>       </code><code>returnteachers;</code>

<code>    </code><code>}</code>

<code>    </code><code>publicvoidsetTeachers(Set&lt;Teacher&gt; teachers) {</code>

<code>       </code><code>this</code><code>.teachers = teachers;</code>

<code>    </code><code>@Id</code>

<code>    </code><code>@GeneratedValue</code>

<code>    </code><code>public</code> <code>Integer getId() {</code>

<code>       </code><code>returnid;</code>

<code>    </code><code>publicvoid setId(Integerid) {</code>

<code>       </code><code>this</code><code>.id = id;</code>

<code>    </code><code>@Column</code><code>(name=</code><code>"s_name"</code><code>)</code>

<code>    </code><code>public</code> <code>String getName() {</code>

<code>       </code><code>returnname;</code>

<code>    </code><code>publicvoid setName(Stringname) {</code>

<code>       </code><code>this</code><code>.name = name;</code>

<code>    </code><code>@Column</code><code>(name=</code><code>"s_age"</code><code>)</code>

<code>    </code><code>public</code> <code>Integer getAge() {</code>

<code>       </code><code>returnage;</code>

<code>    </code><code>publicvoid setAge(Integerage) {</code>

<code>       </code><code>this</code><code>.age = age;</code>

<code>}</code>

<code>@Table</code><code>(name=</code><code>"t_teacher"</code><code>)</code>

<code>public</code> <code>class</code> <code>Teacher {</code>

<code>    </code><code>private</code> <code>Set&lt;Student&gt; students=</code><code>new</code> <code>HashSet&lt;Student&gt;();</code><code>//set不允许重复,最适合数据库模型</code>

<code>    </code><code>@Column</code><code>(name=</code><code>"t_name"</code><code>)</code>

<code>    </code><code>@ManyToMany</code>

<code>    </code><code>@JoinTable</code><code>(name=</code><code>"t_s_two"</code><code>,</code><code>//自定义表名</code>

<code>           </code><code>joinColumns={</code><code>@JoinColumn</code><code>(name=</code><code>"teacher_id"</code><code>)},</code><code>//自定义列名</code>

<code>           </code><code>inverseJoinColumns={</code><code>@JoinColumn</code><code>(name=</code><code>"student_id"</code><code>)})</code><code>//反转,和Teacher对应的那个表的ID,也是自定义</code>

<code>    </code><code>public</code> <code>Set&lt;Student&gt;getStudents() {</code>

<code>       </code><code>returnstudents;</code>

<code>    </code><code>publicvoidsetStudents(Set&lt;Student&gt; students) {</code>

<code>       </code><code>this</code><code>.students = students;</code>

JunitTest单元测试

<code>@Test</code>

<code>    </code><code>publicvoid add(){</code>

<code>       </code><code>try</code> <code>{</code>

<code>           </code><code>Configuration cfg=</code><code>new</code> <code>Configuration();</code>

<code>           </code><code>cfg.configure();</code>

<code>           </code><code>SessionFactory    sessionFactory=cfg.buildSessionFactory();</code>

<code>           </code><code>Sessionsession=sessionFactory.openSession();</code>

<code>           </code><code>session.beginTransaction();</code>

<code>           </code><code>Student s=</code><code>new</code> <code>Student();</code>

<code>           </code><code>s.setAge(</code><code>12</code><code>);</code>

<code>           </code><code>s.setName(</code><code>"张三"</code><code>);</code>

<code>           </code><code>session.save(s);</code>

<code>           </code><code>Student s2=</code><code>new</code> <code>Student();</code>

<code>           </code><code>s2.setAge(</code><code>13</code><code>);</code>

<code>           </code><code>s2.setName(</code><code>"李四"</code><code>);</code>

<code>           </code><code>session.save(s2);</code>

<code>           </code><code>Teacher t=</code><code>new</code> <code>Teacher();</code>

<code>           </code><code>t.setName(</code><code>"张老师"</code><code>);</code>

<code>           </code><code>Teacher t2=</code><code>new</code> <code>Teacher();</code>

<code>           </code><code>t2.setName(</code><code>"李老师"</code><code>);</code>

<code>           </code><code>Set&lt;Student&gt;students=newHashSet&lt;Student&gt;();</code>

<code>           </code><code>students.add(s);</code>

<code>           </code><code>students.add(s2);</code>

<code>           </code><code>t.setStudents(students);</code>

<code>//         Set&lt;Teacher&gt;teachers=new HashSet&lt;Teacher&gt;();</code>

<code>//         teachers.add(t);</code>

<code>//         teachers.add(t2);</code>

<code>//         s.setTeacher(teachers);</code>

<code>//         s2.setTeacher(teachers);</code>

<code>           </code><code>session.save(t);</code>

<code>           </code><code>session.save(t2);</code>

<code>           </code><code>session.getTransaction().commit();</code>

<code>           </code><code>sessionFactory.close();</code>

<code>       </code><code>} </code><code>catch</code> <code>(HibernateException e){</code>

<code>           </code><code>e.printStackTrace();</code>

<code>       </code><code>}</code>

XML配置方法

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code><code>?&gt;</code>

<code>&lt;!DOCTYPE hibernate-mapping PUBLIC </code>

<code>    </code><code>"-//Hibernate/Hibernate Mapping DTD 3.0//EN"</code>

<code>    </code><code>"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;</code>

<code>&lt;</code><code>hibernate-mapping</code> <code>package</code><code>=</code><code>"csg.hibernate.entity"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>class</code> <code>name</code><code>=</code><code>"Student"</code> <code>table</code><code>=</code><code>"t_student"</code><code>&gt;</code>

<code>       </code><code>&lt;</code><code>id</code> <code>name</code><code>=</code><code>"id"</code><code>&gt;</code>

<code>           </code><code>&lt;</code><code>column</code> <code>name</code><code>=</code><code>"id"</code><code>/&gt;</code>

<code>           </code><code>&lt;</code><code>generator</code> <code>class</code><code>=</code><code>"native"</code> <code>/&gt;</code>

<code>       </code><code>&lt;/</code><code>id</code><code>&gt;</code>

<code>       </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"name"</code> <code>/&gt;</code>

<code>       </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"age"</code> <code>/&gt;</code>

<code>       </code><code>&lt;</code><code>set</code> <code>name</code><code>=</code><code>"teachers"</code> <code>table</code><code>=</code><code>"t_s_two"</code><code>&gt;</code>

<code>           </code><code>&lt;</code><code>key</code> <code>column</code><code>=</code><code>"student_id"</code><code>/&gt;</code>

<code>           </code><code>&lt;</code><code>many-to-many</code> <code>class</code><code>=</code><code>"csg.hibernate.entity.Teacher"</code> <code>column</code><code>=</code><code>"Teacher_id"</code><code>/&gt;</code>

<code>       </code><code>&lt;/</code><code>set</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>class</code><code>&gt;</code>

<code>&lt;/</code><code>hibernate-mapping</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>class</code> <code>name</code><code>=</code><code>"Teacher"</code> <code>table</code><code>=</code><code>"t_teacher"</code><code>&gt;</code>

<code>       </code><code>&lt;</code><code>set</code> <code>name</code><code>=</code><code>"students"</code> <code>table</code><code>=</code><code>"t_s_two"</code><code>&gt;</code>

<code>           </code><code>&lt;</code><code>key</code> <code>column</code><code>=</code><code>"teacher_id"</code><code>/&gt;</code>

<code>           </code><code>&lt;</code><code>many-to-many</code> <code>class</code><code>=</code><code>"csg.hibernate.entity.Student"</code> <code>column</code><code>=</code><code>"student_id"</code><code>/&gt;</code>

Ok,大家看到的其实就是将XML中的Set里面的值进行拷贝,修改, 需要注意的是

table和cloum都需要一致!这样建立的中间表才正规!

本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1568931,如需转载请自行联系原作者