通常每个事实联接且仅联接到一个维度成员,而一个维度成员可以与许多不同的事实相关联。例如,每个客户可以具有很多订单,但每个订单只属于一个客户。在关系数据库术语中,这称为“一对多关系”。但有时一个事实可联接多个维度成员。在关系数据库术语中,这称为“多对多关系”。例如,一个客户进行采购的原因可以有多个,而一个采购原因可以与多个采购相关联。联接表用于定义与每个采购相关的销售原因。在由此类关系构建的 Sales Reason 维度中,将有多个成员与一个销售事务相关联。多对多维度可将维度模型扩展到经典星型架构范围之外,并在维度不直接与事实数据表相关联的情况下支持复杂分析。
下面就用学生和老师的关系来说明下,一个学生可以对应多个老师,而一个老师同时也可以教很多学生,这就是一个多对多的关系,映射多对多的关系通常要第三张表在存储二者的关系,在又向的多对多映射中,学生会持有一个老师的集合,表明学生的老师有哪些;老师也会持有学生的一个集合,表明老师所教的学生有哪些。
代码如下:
package fantasy0707.hibernate.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
@Entity
public class Student {
private int id;
private String name;
private Set<Teacher> teachers = new HashSet<Teacher>();
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(mappedBy="students")
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
package fantasy0707.hibernate.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Teacher {
private int id;
private String name;
private Set<Student> students = new HashSet<Student>();
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany
@JoinTable(
name="t_s",
joinColumns=@JoinColumn(name="t_id"),
inverseJoinColumns=@JoinColumn(name="s_id")
)
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
会生成的表有student,teacher,t_s,其中t_s的结构如下:
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| t_id | int(11) | NO | PRI | NULL | |
| s_id | int(11) | NO | PRI | NULL | |
+-------+---------+------+-----+---------+-------+
(老手就不要看了,新手参考就成)