这几天一直看马老师的Hibernate视频..
上面有个视频留了个作业。
就是双向多对多 的 CRUD
学生和老师之间是多对多的关系
会产生一个中间表。 记录着老师ID和学生ID
Delete操作说明一下问题:
一个是要删除一个学生,那这个学生对应的教他的老师必须也得删除这个学生的信息。
不然中间表还是有数据。会出错。
下面是D操作代码:
public void testDeleteStudent() {
this.testSave();
Session session = sf.getCurrentSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
Set<Teacher> teachers = s.getTeachers();
for(Teacher t : teachers) {
t.getStudents().remove(s);
}
session.delete(s);
session.getTransaction().commit();
}
然后是读取操作。 get和load 比较简单, 就不说了。 说下区别
get和load的区别是:
1. load 得到的是代理类 。等到真正用到对象的内容时才发出sql语句。
2. get直接从数据库加载,不会延迟
3. 不存在对应记录时表现不一样
增加数据操作也简单, 主要是 MoreToMore注解的属性 cascade = { CascadeType.All } 级联设置为All.
public void testSave() { Teacher t = new Teacher(); t.setName("t1"); Teacher t2 = new Teacher(); t2.setName("t2"); Student s = new Student(); s.setName("s1"); Student s2 = new Student(); s2.setName("s2"); t.getStudents().add(s); t.getStudents().add(s2); t2.getStudents().add(s); t2.getStudents().add(s2); Session session = sf.getCurrentSession(); session.beginTransaction(); session.save(t); session.save(t2); session.getTransaction().commit(); }
U 操作好像也还好 ....
不写了。 。 居然是我的第一篇博客 .. 嘎嘎嘎。。
睡了睡了 zzzzzzzzz~~~
附上多对多的Annotation
@ManyToMany(cascade=CascadeType.ALL) @JoinTable(name="t_s",joinColumns = { @JoinColumn(name="teacherId")}, inverseJoinColumns= { @JoinColumn(name="studentId") } ) public Set<Student> getStudents() { return students; }
再附上Hibernate三种状态的转换图