首先引题,现在有学生(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();
}
}