先看下需求:
通过分析需求,我们可以通过hibernate映射出表结构
先给出po,这些po都省去了get与set方法
Student ----po:
public class Student {
private Integer id;
private String name;
private Set<Stu_paper> stuPapSet = new HashSet<Stu_paper>();//学生表与中间表的关系是一对多的关系,学生表为一方
}
Paper---po:
public class Paper {
private Integer id;
private String pname;//试卷名称
private String des;//试卷描述
private Set<Stu_paper> papStuSet = new HashSet<Stu_paper>();//试卷表与中间表的关系是一对多的关系,此表为一方
private Set<Topic> topSet = new HashSet<Topic>();//一份试卷可以有多个题目
}
中间表Stu_paper
public class Stu_paper {
private Integer id;
private Student student;//该中间表与学生表是多对一的关系,此为多方
private Paper paper;//该中间表与试卷表是多对一的关系,此为多方
private Double score;//分数
private Date date;//考试时间
private String des;//考试描述
}
Topic---po
public class Topic {
private Integer id;
private String title;
private Integer answer;//A-1;B-2;C-3;D-4
private Integer difficulty;//难度 1-难;2-中;3-简单
private Integer type;//题目类型 1-选择题;2-问答题
private Set<Paper> papSet = new HashSet<Paper>();//一个题目可以属于多份试卷
private Set<Options> optSet = new HashSet<Options>();//一道题可以有多个选项
}
Options---po
//选项类
public class Options {
private Integer id;
private String name;
private Topic topic;//一道题对应多个选项,选项表为多方
}
此处注意一下Option是MySql的保留关键字,所以后面加了个s,表示选项,否则不能正确生成表
下面贴上相关的xml配置文件:
Student.hbm.xml
<hibernate-mapping package="com.bjsxt.po">
<class name="Student" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="stuPapSet" >
<key>
<column name="stu_id"></column>
</key>
<one-to-many class="Stu_paper"/>
</set>
</class>
</hibernate-mapping>
Paper.hbm.xml
<hibernate-mapping package="com.bjsxt.po">
<class name="Paper" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="pname"></property>
<property name="des"></property>
<set name="papStuSet" >
<key>
<column name="pap_id"></column>
</key>
<one-to-many class="Stu_paper"/>
</set>
<set name="topSet" table="pap_topic">
<key>
<column name="top_id" ></column>
</key>
<many-to-many class="Topic" column="pap_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Stu_paper.hbm.xml
<hibernate-mapping package="com.bjsxt.po">
<class name="Stu_paper" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="score"></property>
<property name="date"></property>
<property name="des"></property>
<many-to-one name="student" class="Student" >
<column name="stu_id"></column>
</many-to-one>
<many-to-one name="paper" class="Paper">
<column name="pap_id"></column>
</many-to-one>
</class>
</hibernate-mapping>
Topic.hbm.xml
<hibernate-mapping package="com.bjsxt.po">
<class name="Topic" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="title"></property>
<property name="answer"></property>
<property name="difficulty"></property>
<property name="type"></property>
<set name="papSet" table="pap_topic">
<key>
<column name="pap_id"></column>
</key>
<many-to-many class="Paper" column="top_id"/>
</set>
<set name="optSet">
<key>
<column name="top_id"></column>
</key>
<one-to-many class="Options"/>
</set>
</class>
</hibernate-mapping>
Options.hbm.xml
<hibernate-mapping package="com.bjsxt.po">
<class name="Options" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="topic" class="Topic">
<column name="top_id"></column>
</many-to-one>
</class>
</hibernate-mapping>
下面贴出hibernate的配置映射:
<mapping resource="com/bjsxt/po/Student.hbm.xml" />
<mapping resource="com/bjsxt/po/Stu_paper.hbm.xml" />
<mapping resource="com/bjsxt/po/Paper.hbm.xml" />
<mapping resource="com/bjsxt/po/Topic.hbm.xml" />
<mapping resource="com/bjsxt/po/Options.hbm.xml" />
到此代码部分就完成了,使用的时候注意分清po之间的映射关系。要注意外键都在多方,对于一方po都有Set。<many-to-one>如果写的时候忘记加上column属性,生成表会出现一个叫elt的字段,所以这一点是一定要注意的column里写得都是外键字段的名称。中间表的作用是把多对多的关系转成两个一对多的关系。其中中间表也可以加入其它字段,这要要所业务来定是否要加入,如果有需要,则要把中间表写成一个po来映射表结构,生成表结构中会加入这些你加入的字段,如果不需要加入一些字段,则直接写多对多的配置就行,即<many-to-many>,注意彼此的column对应起来,这样生成的中间表结构中就只有两个外键的字段。