双向多对一映射其实跟单向差不多,只是在一方多了些配置,使一方能获取到多方的相关数据

应用场景:以学生与老师为例,学生为多的一方,老师是一的一方,在特定的情况下,一个学生只面对一个老师,但一个老师要面对多个学生。单向则是从多方学的生这边可以获取老师的信息,一方的老师这边也可以获取他下面有哪些学生。如下:

实体类: Student public class Student {

private int id;

private String name;

private Date birthday;

private int age;

private Teacher teacher;

setter .....

getter......

@Override

public String toString() {

return "Student [id=" + id + ", name=" + name + ", birthday=" + birthday + ", age=" + age + ", teacher="

+ teacher + "]";

} Teacher

public class Teacher {

private int id;

private String name;

private Set students=new HashSet();

setter............ getter.......

@Override

public String toString() {

return "Teacher [id=" + id + ", name=" + name + "]";

}

} 注意:在写tostring方法时如果 有集合属性,按默认生成的toString方法,将其直接写入,在进行hibernate查询时,如果直接打印查询到的对象,会出现java.lang.StackOverflowError的异常,需去掉集合。 如:Teacher类中写成: public String toString() {         return "Teacher [id=" + id + ", name=" + name + ", students=" + students + "]";     }     hbm.xml映射配置 Student.hbm.xml

Teacher.hbm.xml

 测试 import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.boot.MetadataSources;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import com.restfullDemo.model.Student;

import com.restfullDemo.model.Teacher;

/**

* @author: ljd

* @date:2018年10月28日 下午1:55:13

*

*/

public class TestStudentDao {

SessionFactory sessionFactory;

Session session;

Transaction transaction;

@Before

public void init() {

Configuration configuration=new Configuration().configure();

ServiceRegistry serviceRegistry=configuration.getStandardServiceRegistryBuilder().build();

sessionFactory=new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();

session=sessionFactory.openSession();

transaction=session.beginTransaction();

}

@After

public void closeSession() {

transaction.commit();

session.close();

}

@Test

public void saveTeache() throws ParseException{

Teacher tc=new Teacher();

tc.setName("张老师");

/* 学生 */

Student st=new Student();

st.setName("李四");

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

Date dt=sdf.parse("2001-05-10");

st.setBirthday(dt);

st.setTeacher(tc);

Student st2=new Student();

st2.setName("小胖");

Date dt3=sdf.parse("2001-03-10");

st2.setBirthday(dt3);

st2.setTeacher(tc);

tc.getStudents().add(st);

tc.getStudents().add(st2);

/* 在数据库表中同时插入多方和一方的数据时,先插入一方的数据,再插入多方的数据,效率会更高些 */

session.save(tc);

session.save(st2);

session.save(st);

}

}

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: