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 (?, ?)








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值