纸上得来终觉浅
上篇是单向一对一,这篇是单向的其他方式; 顺便说一下 ”单向A对B“,指的就是A的那一方能够加载到B;
1.多对一就是多的那一方(A)能够加载另一方:
只需要在上篇文章中的单向外键一对一加载中去掉 uniqe属性即可:
<many-to-one name="teacher" column="teacherId" ></many-to-one>
这个时候teacherId这列的值是可以重复的
2.一对多
例如B(Teacher)拥有很多A(学生):
A正常(没有B属性),只在B中增加A属性:
package roadArchitectWeb;
import java.util.HashSet;
import java.util.Set;
public class Teacher {
private Integer Id;
private String Name;
private String PhoneNum;
private Set<Student> Students = new HashSet<>();
public Set<Student> getStudents() {
return Students;
}
public void setStudents(Set<Student> students) {
Students = students;
}
public Integer getId() {
return Id;
}
public void setId(Integer id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getPhoneNum() {
return PhoneNum;
}
public void setPhoneNum(String phoneNum) {
PhoneNum = phoneNum;
}
public Teacher() {
}
@Override
public String toString() {
return "Teacher [Id=" + Id + ", Name=" + Name + ", PhoneNum=" + PhoneNum + ", Students=" + Students + "]";
}
}
A的配置文件也正常配置,B的配置文件改为:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-21 19:24:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="roadArchitectWeb.Teacher" table="TEACHER">
<id name="Id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="Name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="PhoneNum" type="java.lang.String">
<column name="PHONENUM" />
</property>
<!-- name指本类中的属性,class对应哪一个类,table对应哪一个表格,column生成哪一个列作为外键; -->
<set name="Students" table="STUDENT">
<key column="teacherId"></key>
<one-to-many class="roadArchitectWeb.Student"/>
</set>
</class>
</hibernate-mapping>
这种方式,其实就是在A中增加了一列,作为外键,和多对一的数据库实现是一样的,只是这个时候再B中增加了A属性,其实就是这种关联管理由B来管理,所以B能够加载到A
3.单向多对多
根据学习知道,单向多对多,就是A可以有多个B,B可以有多个A,单向就是一方能加载另一方,另一方不能加载己方。如B(Teacher)可以有多个A,A可以有多个B,B能够
加载到A, 只要把上述的一对多的B的配置文件改为如下即可“:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-21 19:24:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="roadArchitectWeb.Teacher" table="TEACHER">
<id name="Id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="Name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="PhoneNum" type="java.lang.String">
<column name="PHONENUM" />
</property>
<!-- name指本类中的属性,table生成的关联表的名字,key column本类在关联表中的外键,many-to-many column
代表Student类在关联表中的外键 -->
<set name="Students" table="Join_Table">
<key column="teacherId"></key>
<many-to-many column="StudentId" class="roadArchitectWeb.Student"/>
</set>
</class>
</hibernate-mapping>
这种多对多单向关联其实是通过关联表“Join_Table”来维持A与B的关系,数据库会新增关联表”Join_Table“。
下篇讲双向关联。