001-List,数组,Set,Map属性的映射

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://localhost/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">mysqladmin</property>
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <mapping resource="sqlmap/News.hbm.xml"/>
        <mapping resource="sqlmap/Person.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Person.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.amazing.hibernate.domain">

    <class name="Person" table="person">
        <id name="id" type="integer" column="ID">
            <generator class="identity"/>
        </id>
        <property name="name" type="string" column="name"/>
        <property name="age" type="integer" column="age"/>
        <list name="schools" table="school">
            <key column="personId"/>
            <list-index column="listIndex"/>
            <element type="string" column="schoolName"/>
        </list>
    </class>

</hibernate-mapping>

Person.java:

package com.amazing.hibernate.domain;

import java.util.ArrayList;
import java.util.List;

public class Person {
    
    private Integer id;
    private String name;
    private int age;
    private List<String> schools = new ArrayList<String>();
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer 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;
    }
    public List<String> getSchools() {
        return schools;
    }
    public void setSchools(List<String> schools) {
        this.schools = schools;
    }
    
}

TestList.java:

package com.amazing.hibernate.domain;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class TestList {

    @Test
    public void testListMapping(){
        Configuration conf = new Configuration().configure();
        SessionFactory sf = conf.buildSessionFactory();
        Session session = sf.getCurrentSession();
        Transaction txt = session.beginTransaction();
        
        Person p1 = new Person();
        p1.setName("tom");
        p1.setAge(24);
        List<String> schools1 = new ArrayList<String>();
        schools1.add("小学");
        schools1.add("初中");
        p1.setSchools(schools1);
        session.save(p1);
        
        Person p2 = new Person();
        p2.setName("jack");
        p2.setAge(28);
        List<String> schools2 = new ArrayList<String>();
        schools2.add("高中");
        schools2.add("大学");
        p2.setSchools(schools2);
        session.save(p2);
        
        txt.commit();
        System.out.println("session.isOpen():"+session.isOpen());//false
        System.out.println("sf.isClosed():"+sf.isClosed());//false
        sf.close();
    }
}

 

若schools为String数组类型,即private String[] schools.映射文件Person.hbm.xml只需要将list元素改为array即可。

若schools为Set类型,即private Set<String> schools.映射文件Person.hbm.xml稍作修改:

<set name="schools" table="school">
    <key column="personId"/>
    <element type="string" column="schoolName" not-null="true"/>
</set>

若Person类有一个Map属性,即private Map<String,Float> scores.映射文件Person.hbm.xml稍作修改:

<map name="scores" table="score">
    <key column="personId" not-null="true"/>
    <map-key column="subject" type="string"/>
    <element column="grade" type="float"/>
</map>
package com.amazing.hibernate.domain;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class TestDemo {

    @Test
    public void testListMapping(){
        Configuration conf = new Configuration().configure();
        SessionFactory sf = conf.buildSessionFactory();
        Session session = sf.getCurrentSession();
        Transaction txt = session.beginTransaction();
        
        Person p = new Person();
        p.setName("tom");
        p.setAge(24);
        Map<String,Float> scores = new HashMap<String,Float>();
        scores.put("语文", 85f);
        scores.put("数学", 92f);
        p.setScores(scores);
        session.save(p);
        
        txt.commit();
        System.out.println("session.isOpen():"+session.isOpen());
        System.out.println("sf.isClosed():"+sf.isClosed());
        sf.close();
    }
}

posted on 2016-03-28 17:46  confirmCname  阅读(159)  评论(0编辑  收藏  举报

导航