今天接下来我们学习下hibernate里面的多对多的关系映射
多对多:由三张表组成,如学生表,课程表与学生课程表,一个学生可以参加多门课程,一个课程可以被多个学生参加。用户表,商品表,订单表。一个用户可以购买多个商品,一个商品可以供多个用户购买
这么说也就是得有一个中间关系表里面存2个表的主键;进行关联
首先我们从实体类想也就是说学生表里有课程的集合,课程里面有学生的集合对象;
public class Coures {
private Long id;
private String name;
private Set<Student> students;
public class Student {
private Long id;
private String name;
private Set<Coures> coures;
映射文件:
学生映射文件:
<hibernate-mapping>
<class name="com.wfg.bean.Student" table="student" catalog="manytomany">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="15" />
</property>
<!-- table 这里是指中间表 -->
<set name="coures" cascade="save-update" table="stu_cour">
<key>
<column name="student_ID" />
</key>
<!-- 这2个column 不要搞颠倒 上面的表示对方的外键 和 一对多一样的 下面的是被关联表做外键 -->
<many-to-many class="com.wfg.bean.Coures" column="course_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
课程映射文件:
<hibernate-mapping>
<class name="com.wfg.bean.Coures" table="coures" catalog="manytomany">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="15" />
</property>
<set name="students" table="stu_cour" cascade="save-update" inverse="true">
<key>
<column name="course_id" />
</key>
<many-to-many class="com.wfg.bean.Student" column="student_ID"></many-to-many>
</set>
</class>
</hibernate-mapping>
使用下面的方法生成sql语句创建表:
public static void main(String[] args) {
Configuration configuration =new Configuration().configure();
SchemaExport sch = new SchemaExport(configuration);
sch.create(true, false);
}
测试代码:
Student stu1 = new Student();
stu1.setName("张三");
Coures cou1 = new Coures();
cou1.setName("chinense");
stu1.setCoures(new HashSet<Coures>());
cou1.setStudents(new HashSet<Student>());
//建立关系
stu1.getCoures().add(cou1);
cou1.getStudents().add(stu1);
// session.save(stu1);
session.save(cou1);
我在写demo的时候发现了其中一个问题:也就是前面写一对一,一对多时把数据库名称都是写在了映射文件上面:即catalog=”manytomany”
这个catalog属性配置的,但是这个多对多这么配置是不可以
会报如此的错误:
这2个提示是这么个意思:
Could not execute JDBC batch update 原因可能是映射文件有问题(但不仅限于此原因)我再三看我写的映射文件没问题,又一看下面
No database selected 这个是说没找不到相应的数据库
我便常识在hibernate的主配置文件里面添加了数据库名称
property name=”connection.url”>
jdbc:mysql://127.0.0.1:3306/manytomany
博客里面考虑篇幅太长所以代码都是关键代码不是全部,要获取全部代码可以自行下载:
链接:http://pan.baidu.com/s/1kU5zXmZ 密码:1wt1