hibernate map简单实现一对多关系映射

首先引题,现在有学生(1)成绩(多)两张表,要求使用hibernate关系映射(xml方式)建立它们之间的一对多关系。并且使用map更新学生的成绩
首先建立实体类
Student.java

package entities;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/*
变量依次为:学号、姓名、性别、出生日期、分数(纯映射用 students表中无此字段)
*/
public class Student {
    private Long studentNum;
    private String name;
    private String sex;
    private Date date;

    private Map<String,String> mark;

    public Student() {
        mark = new HashMap<>();
    }

    public Long getStudentNum() {
        return studentNum;
    }

    public void setStudentNum(Long studentNum) {
        this.studentNum = studentNum;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }


    public Map<String, String> getMark() {
        return mark;
    }

    public void setMark(Map<String, String> mark) {
        this.mark = mark;
    }
}

接着建立 Student的关系映射文件
Student.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entities">
    <!-- 标识一个类的xml映射,name为类名,table为表名 -->
    <class name="Student" table="students">
        <id name="studentNum" type="java.lang.Long">
            <column name="studentNum"/>
            <generator class="native"/>
        </id>
        <property name="name" type="java.lang.String" column="name"/>
        <property name="sex" type="java.lang.String" column="sex"/>
        <property name="date" type="java.util.Date" column="date"/>
        <property name="classNum" type="java.lang.Integer" column="class" />
        <map name="mark" table="marks">
            <key column="studentNum"/>
            <index type="java.lang.String" column="m_id" />
            <element type="java.lang.String" column="mark" />
        </map>
    </class>
</hibernate-mapping>

这里解释下 class标签内,name为Student中的属性名,column为students表中字段名 type表示字段值的类型
比较难理解的是这里的 map标签
map标签在这里是为了建立两个表的关系
name指定在 Student 中的 map变量名 table指定建立关系的表名
标签 column属性指定了marks表的外键stuentNum
或者 都是为了map中的key值在marks表中的映射
是为了 map value值的映射

接着是成绩实体类
值得注意的是一对多 为多的一方在实体类中包含为一的实体类
这里是 分数中含有一个学生类
Mark.java

package entities;

public class Mark {
    private  Long studentNum;
    private String m_id;
    private String mark;
    private Student student;

    public Long getStudentNum() {
        return studentNum;
    }

    public void setStudentNum(Long studentNum) {
        this.studentNum = studentNum;
    }

    public String getM_id() {
        return m_id;
    }

    public void setM_id(String m_id) {
        this.m_id = m_id;
    }

    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}

最后是分数的对应关系映射文件
Mark.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entities">
    <!-- 标识一个类的xml映射,name为类名,table为表名 -->
    <class name="Mark" table="marks">

        <id name="studentNum" type="java.lang.Long">
            <column name="studentNum"/>
        </id>

        <!--创建表 制定字段类型-->
        <property name="m_id" type="java.lang.String" column="m_id"/>
        <property name="mark" type="java.lang.String" column="mark"/>
    </class>
</hibernate-mapping>

最后放上测试代码

import entities.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Test {
    public static void main(String args[]){
        Configuration cfg = new Configuration();
        SessionFactory sf = cfg.configure().buildSessionFactory();
        Student s = new Student();
        s.setStudentNum(new Long(12312));
        s.getMark().put("aa","a22");
        s.getMark().put("123","11");
        Session session = sf.getCurrentSession();
        session.beginTransaction();
        session.save(s);
        session.getTransaction().commit();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值