hibernate常见映射关系示例

先看下需求:

通过分析需求,我们可以通过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对应起来,这样生成的中间表结构中就只有两个外键的字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值