Hibernate高级实体关联映射之多值的实体关联(用组件类实现三重关联,单向导航)
这里只演示了单向导航的例子。
这个例子从Hibernate高级实体关联映射之多值的实体关联(多对多关联的两种思路之二)这篇bog演变而来。这个例子增加了一个实体,MyClass中有这三个实体的外键。请看代码 :
pom.xml:
resources/hibernate.cfg.xml:
pojo/Teacher.java:
public String getTeacher_id() {
return teacher_id;
}
@SuppressWarnings("unused")
private void setTeacher_id(String teacher_id) {
this.teacher_id = teacher_id;
}
public String getTeacher_name() {
return teacher_name;
}
public void setTeacher_name(String teacher_name) {
this.teacher_name = teacher_name;
}
public int getTeacher_age() {
return teacher_age;
}
public void setTeacher_age(int teacher_age) {
this.teacher_age = teacher_age;
}
public Collection<MyClass> getMyClassList() {
return myClassList;
}
public void setMyClassList(Collection<MyClass> myClassList) {
this.myClassList = myClassList;
}
}
pojo/Teacher.hbm.xml:
pojo/Student.java:
public String getStudent_id() {
return student_id;
}
@SuppressWarnings("unused")
private void setStudent_id(String student_id) {
this.student_id = student_id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public int getStudent_age() {
return student_age;
}
public void setStudent_age(int student_age) {
this.student_age = student_age;
}
}
pojo/Student.hbm.xml:
pojo/Group.java:
public String getGroup_id() {
return group_id;
}
@SuppressWarnings("unused")
private void setGroup_id(String group_id) {
this.group_id = group_id;
}
public String getGroup_name() {
return group_name;
}
public void setGroup_name(String group_name) {
this.group_name = group_name;
}
public int getGroup_num() {
return group_num;
}
public void setGroup_num(int group_num) {
this.group_num = group_num;
}
}
pojo/Group.hbm.xml:
pojo/MyClass.java:
//值类型的组件类不需要标识符,也就是不用主键类
private String className;
private String schoolName;
private Calendar createTime;
private Student student;
private Teacher teacher;
private Group group;
public MyClass(){}
public MyClass(String className,String schoolName,Student student,Teacher teacher,Group group){
this.className = className;
this.schoolName = schoolName;
this.student = student;
this.teacher = teacher;
this.createTime = Calendar.getInstance();
this.group = group;
//不需要关联代码了
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
public Calendar getCreateTime() {
return createTime;
}
public void setCreateTime(Calendar createTime) {
this.createTime = createTime;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
//如果是用set集合,这里还要实现equals()和hashCode()方法
}
util/HibernateUtil.java:
util/Manager.java:
Teacher t = new Teacher();
t.setTeacher_name("fhd");
t.setTeacher_age(35);
Student s = new Student();
s.setStudent_name("fuhaidong");
s.setStudent_age(30);
Group g = new Group();
g.setGroup_name("group111");
g.setGroup_num(80);
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(t);
session.save(s);
session.save(g);
MyClass my = new MyClass("class1111111", "schoolName1111111",s,t,g);
//添加
t.getMyClassList().add(my);
System.out.println(t.getMyClassList().size());
session.flush();
//删除
t.getMyClassList().remove(my);
transaction.commit();
session.close();
}
}
表结构:
上例是用bag实现的关联,用set也可以实现, 但list,map不知道可不可以,不过没有测试!!