Hibernate之复杂映射

实例的准备工作请看:http://write.blog.csdn.net/postedit/48010949

==========》复合主键映射

1、在src建立com.hibernate.test4包,并建立Area.java、Area.hbm.xml,并且把Area.hbm.xml添加到hibernate.cfg.xml中。

area表的sql为:CREATE TABLE area(province varchar(15) not null,village varchar(15) not null,income float not null,primary key(province,village));

Area.java

package com.hibernate.test4;
import java.io.Serializable;
public class Area implements Serializable{
    private String province;
    private String village;
    private float income;
    public Area() {
        super();
        // TODO Auto-generated constructor stub
    }

此处省略get、set方法

}

Area.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-10-2 9:52:03 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.hibernate.test4.Area" table="AREA">
        <composite-id>
            <key-property name="province" column="province" type="string"></key-property>
            <key-property name="village" column="village" type="string"></key-property>
        </composite-id>
        <property name="income" type="float">
            <column name="INCOME" />
        </property>
    </class>
</hibernate-mapping>

2、建立测试类Test1,测试运行结果。

package com.hibernate.test4;
import static org.junit.Assert.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
public class Test1 {
    @Test
    public void test() {
        Session session=null;
        Transaction tx=null;
            try {
                session=HibernateUtil.getSessionFactory().openSession();
                tx=session.beginTransaction();
                Area area=new Area();
                area.setProvince("云南省");
                area.setVillage("花甲村");
                area.setIncome(100000);
                session.save(area);
                tx.commit();
            } catch (RuntimeException e) {
                // TODO Auto-generated catch block
                try {
                    tx.rollback();
                } catch (RuntimeException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }finally{
                session.close();
            }
    }
}

运行结果:

Hibernater输出sql:insert into AREA (INCOME, province, village) values (?, ?, ?)

复合主键映射的类必须要继承Serializable接口,否则会抛出异常

==========》Set映射

1、建立PersonImg.java、Person.java,与及Person.hbm.xml

Person表的sql为:CREATE TABLE Person(PersonId int not null primary key,Personname varchar(15) not null,Personage int not null);

Person.java

package com.hibernate.test4;

import java.util.HashSet;
import java.util.Set;
public class Person {
    private int PersonId;
    private String Personname;
    private int Personage;
    private Set<String> personImage=new HashSet<String>();
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    此处省略get、set方法
}

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-10-2 14:13:34 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.hibernate.test4.Person" table="PERSON">
        <id name="PersonId" type="int">
            <column name="PERSONID" />
            <generator class="assigned" />
        </id>
        <property name="Personname" type="java.lang.String">
            <column name="PERSONNAME" />
        </property>
        <property name="Personage" type="int">
            <column name="PERSONAGE" />
        </property>
        <set name="personImage" table="PERSONIMG">
            <key column="PersonId">
            </key>
            <element type="string" column="Image"></element>
        </set>
    </class>
</hibernate-mapping>

PersonImg.java

package com.hibernate.test4;
public class PersonImg {
    private int PersonId;
    private String Image;
    public PersonImg() {
        super();
        // TODO Auto-generated constructor stub
    }
    此处省略get、set方法
}

***********这里并不需要建立PersonImg.hbm.xml

2、建立测试类Test1.java进行测试

package com.hibernate.test4;
import static org.junit.Assert.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
public class Test1 {
    @Test
    public void test() {
        Session session=null;
        Transaction transaction=null;
        try {
            session=HibernateUtil.getSessionFactory().openSession();
            transaction=session.beginTransaction();
            Person person=new Person();
            person.setPersonage(20);
            person.setPersonname("mrw");
            person.getPersonImage().add("1.jpg");
            person.getPersonImage().add("2.jpg");
            session.save(person);
            transaction.commit();
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            session.close();
        }
    }
}

运行结果:

Hibernate输出sql:

insert into PERSON (PERSONNAME, PERSONAGE, PERSONID) values (?, ?, ?)

insert into PERSONIMG (PersonId, Image) values (?, ?)
insert into PERSONIMG (PersonId, Image) values (?, ?)








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值