hibernate的list映射和map映射

来源:互联网 发布:西北大学网络教育 编辑:程序博客网 时间:2024/06/05 06:46

这篇博客讲两个映射,一个是list,另一个是map


list的映射


新建一个java项目

结构如下;



需要的jar包以及如何配置,请参见《Hibernate环境搭建和配置


实体类Grade代码:

package com.robert.pojo;import java.util.ArrayList;import java.util.List;/** * 年级类 */public class Grade {private int id ;private String name ;//年级名称private List<Student> students = new ArrayList<Student>() ;public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


对应的配置文件Grade.hbm.xml代码:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.robert.pojo"><class name="Grade"><id name="id"><generator class="native"></generator></id><property name="name"></property><list name="students"><!-- key:外键;column:外键列名; --><key column="grade_id" not-null="true" /><!-- 在多的一端,产生一列,用来表示顺序,如果不指明列名,默认为idx,值由hibernate来维护 --><list-index column="sort"></list-index><!-- ont-to-many:一对多,类Grade中students所表示的类型 --><one-to-many class="Student"/></list></class></hibernate-mapping>

实体类Student代码:

package com.robert.pojo;/** * 学生类 */public class Student {private int id ;private String name ;//姓名private int age ;    //年龄public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

对应的配置文件Student.hbm.xml代码:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.robert.pojo"><class name="Student"><id name="id"><generator class="native"></generator></id><property name="name"></property><property name="age"></property></class></hibernate-mapping>


hibernate.cfg.xml代码:

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 配置数据库连接信息 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql:///hibernate4</property><property name="connection.username">root</property><property name="connection.password">root</property><!-- 数据库方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 是否打印sql语句 --><property name="show_sql">true</property><!-- 格式化sql语句 --><property name="format_sql">true</property><!-- 数据库更新方式: 1、create:每次更新都先把原有数据库表删除,然后创建该表;2、create-drop:使用create-drop时,在显示关闭SessionFacroty时(sessionFactory.close()),将drop掉数据库Schema(表) 3、validate:检测;4、update(常用):如果表不存在则创建,如果存在就不创建--><property name="hbm2ddl.auto">update</property><!-- 加载Score实体类对应的配置文件 --><mapping resource="com/robert/pojo/Grade.hbm.xml" /><mapping resource="com/robert/pojo/Student.hbm.xml" /></session-factory></hibernate-configuration>


HibernateUtil代码:

package com.robert.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;/** * hibernate工具类 */public class HibernateUtil {private static Configuration cfg = null;private static SessionFactory factory = null;private static Session session = null ;static {init();}/** * 初始化获得Configuration和SessionFacroty对象 */public static void init() {cfg = new Configuration().configure();factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build());}/** * 获得Session对象 * @return */public static Session getSession() {if (factory != null){return session = factory.openSession();}init();return session = factory.openSession();}/** * 关闭Session */public static void closeSession() {if(session!=null && session.isOpen())session.close();}}

HIbernateTest代码:

package com.robert.test;import java.io.IOException;import java.sql.SQLException;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import javax.sql.rowset.serial.SerialException;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;import org.junit.Test;import com.robert.pojo.Grade;import com.robert.pojo.Student;import com.robert.util.HibernateUtil;public class HibernateTest {/** * 根据*.hbm.xml文件对应的生成数据库表 */@Testpublic void testCreateDB() {Configuration cfg = new Configuration().configure();SchemaExport se = new SchemaExport(cfg);// 第一个参数:是否生成ddl脚本// 第二个参数:是否执行到数据库中se.create(true, true);}/** * 保存数据 * @throws HibernateException * @throws SerialException * @throws SQLException * @throws IOException */@Testpublic void testSave() throws HibernateException, SerialException,SQLException, IOException {Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx = session.beginTransaction();Grade grade = new Grade();grade.setName("基础") ;session.save(grade);Student student = new Student() ;student.setName("张三") ;student.setAge(22) ;Student student2 = new Student() ;student2.setName("李四") ;student2.setAge(23) ;grade.getStudents().add(student) ;grade.getStudents().add(student2);//由于在Grade.hbm.xml中外键配置了not-null="true",即不为空,//所以先保存grade,再保存student;//如果外键可为空,则先保存哪一个对象都可以;session.save(grade);session.save(student) ;session.save(student2);tx.commit();} catch (HibernateException e) {if (tx != null) {tx.rollback();}e.printStackTrace();throw e;} finally {HibernateUtil.closeSession();}}@Testpublic void testGet() {Session session = null ;Transaction tx = null ;try {session = HibernateUtil.getSession() ;tx = session.beginTransaction() ;//取数据Grade grade = (Grade) session.get(Grade.class, 1) ;System.out.println("grade_name:"+grade.getName());Iterator<Student> it = grade.getStudents().iterator() ;while (it.hasNext()) {Student student = (Student) it.next();System.out.println("student_name:"+student.getName());}tx.commit() ;} catch (Exception e) {tx.rollback();e.printStackTrace();}finally {HibernateUtil.closeSession() ;}}}


结果自己运行


=======================================================================

map映射

只有实体类Grade和Grade.hbm.xml配置文件和上面不同,其他的都相同

Grade代码:

package com.robert.pojo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * 年级类 */public class Grade {private int id ;private String name ;//年级名称private Map<String, Student> students = new HashMap<String, Student>() ;public Map<String, Student> getStudents() {return students;}public void setStudents(Map<String, Student> students) {this.students = students;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Grade.hbm.xml代码:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.robert.pojo"><class name="Grade"><id name="id"><generator class="native"></generator></id><property name="name"></property><map name="students"><!-- key:表示外键 --><key column="grade_id" /><!-- map-key:是映射为map集合时,对应的key值 --><map-key type="string" column="name" /><one-to-many class="Student"/></map></class></hibernate-mapping>

其他的自己运行测试就可以