hibernate component(转)

本文介绍如何使用Hibernate的component标签来映射复杂对象,并通过一个具体示例展示了配置文件及POJO类的设计方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将实体对象中的逻辑组成称为component。在配置文件中,使用component节点对组件进行声明。

例如,一个用户有两个部分组成,姓名和联系方式。姓名和联系方式都可以作为用户的组成部分。

1.表结构如下

use sample;
DROP TABLE t_user;

CREATE TABLE t_user (
       id 
INT NOT NULL AUTO_INCREMENT
     , age 
INT
     , firstname 
VARCHAR(50)
     , lastname 
VARCHAR(50)
     , address 
VARCHAR(200)
     , zipcode 
VARCHAR(10)
     , tel 
VARCHAR(20)
     , 
PRIMARY KEY (id)
);


2.配置文件
TUser.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">
<hibernate-mapping>
<!-- 
        Auto-generated mapping file from
        the hibernate.org cfg2hbm engine
-->
    <class name
="cn.blogjava.component.TUser" table="t_user" catalog="sample">
        <id name
="id" type="integer">
            <column name
="id" />
            <generator class
="native" />
        </id>
        <property name
="age" type="integer">
            <column name
="age" />
        </property>
        <component name
="name" class="cn.blogjava.component.Name">
            <property name
="firstname" type="string">
                <column name
="firstname" length="50" />
            </property>
            <property name
="lastname" type="string">
                <column name
="lastname" length="50" />
            </property>
        </component>
        <component name
="contact" class="cn.blogjava.component.Contact">
            <property name
="address" type="string">
                <column name
="address" length="200" />
            </property>
            <property name
="zipcodes" type="string">
                <column name
="zipcode" length="10" />
            </property>
            <property name
="tel" type="string">
                <column name
="tel" length="20" />
            </property>
        </component>
    </class>
</hibernate-mapping>

将TUser.hbm.xml配置文件加入到hibernate.cfg.xml中去

3.POJO类
Contact.java

package cn.blogjava.component;

import java.io.Serializable;

public class Contact implements Serializable {
    
    
private String address;
    
private String zipcodes;
    
private String tel;
    
    
public String getAddress() {
        
return address;
    }
    
public void setAddress(String address) {
        
this.address = address;
    }
    
public String getTel() {
        
return tel;
    }
    
public void setTel(String tel) {
        
this.tel = tel;
    }
    
public String getZipcodes() {
        
return zipcodes;
    }
    
public void setZipcodes(String zipcodes) {
        
this.zipcodes = zipcodes;
    }
    
    
}


Name.java

package cn.blogjava.component;

import java.io.Serializable;

public class Name implements Serializable {
    
    
private String firstname;
    
private String lastname;
    
    
public String getFirstname() {
        
return firstname;
    }
    
public void setFirstname(String firstname) {
        
this.firstname = firstname;
    }
    
public String getLastname() {
        
return lastname;
    }
    
public void setLastname(String lastname) {
        
this.lastname = lastname;
    }
    
    
}


TUser.java

package cn.blogjava.component;


public class TUser  implements java.io.Serializable {
    
private Integer id;
    
private Integer age;
    
private Name name;
    
private Contact contact;
    
    
public Integer getAge() {
        
return age;
    }
    
public void setAge(Integer age) {
        
this.age = age;
    }
    
public Contact getContact() {
        
return contact;
    }
    
public void setContact(Contact contact) {
        
this.contact = contact;
    }
    
public Integer getId() {
        
return id;
    }
    
public void setId(Integer id) {
        
this.id = id;
    }
    
public Name getName() {
        
return name;
    }
    
public void setName(Name name) {
        
this.name = name;
    }
     
}


4.测试类

package cn.blogjava.component;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import junit.framework.TestCase;
import junit.framework.Assert;

public class HibernateTest extends TestCase {
    
    Session session 
= null;
    
    
protected void setUp(){
        
try {
            Configuration config 
= new Configuration().configure();
            SessionFactory sessionFactory 
= config.buildSessionFactory();
            session 
= sessionFactory.openSession();
//            delete();
        } catch (HibernateException e) {
            
// TODO: handle exception
            e.printStackTrace();
        }
    }
    
    
protected void tearDown() {
        
try {
            session.close();
        } 
catch (HibernateException e) {
            
// TODO: handle exception
            e.printStackTrace();            
        }
    }
    
    
public void delete(){
        Transaction tran 
= null;
        String hql 
= " delete TUser";
        
try {
            tran 
= session.beginTransaction();
            Query query 
= session.createQuery(hql);
            
int ret = query.executeUpdate();
            System.out.println(
"Delete records => " + ret);
            tran.commit();
        } 
catch (HibernateException e) {
            
// TODO: handle exception
            e.printStackTrace();
            Assert.fail(e.getMessage());
            
if(tran != null) {
                
try {
                    tran.rollback();
                } 
catch(HibernateException e2) {
                    e2.printStackTrace();
                }
            }
        }
    }
    
    
public void testInsert(){
        Transaction tran 
= null;
        
try {
            System.out.println(
"session is " + session);
            tran 
= session.beginTransaction();
            
            
//user1
            TUser user = new TUser();
            user.setAge(
25);
            Name name 
= new Name();
            name.setFirstname(
"yu");
            name.setLastname(
"yy");
            user.setName(name);
            Contact contact 
= new Contact();
            contact.setAddress(
"dalian");
            contact.setTel(
"42689334");
            contact.setZipcodes(
"116023");
            user.setContact(contact);
            
            session.save(user);
            
            
//user2
            TUser user2 = new TUser();
            user2.setAge(
26);
            Name name2 
= new Name();
            name2.setFirstname(
"bai");
            name2.setLastname(
"yf");
            user2.setName(name2);
            Contact contact2 
= new Contact();
            contact2.setAddress(
"beijing");
            contact2.setTel(
"12345678");
            contact2.setZipcodes(
"100010");
            user2.setContact(contact2);            
            
            session.save(user2);
            
            session.flush();
            tran.commit();
            Assert.assertEquals(user.getId().intValue() 
> 0true);
        } 
catch (Exception e) {
            
// TODO: handle exception
            e.printStackTrace();
            Assert.fail(e.getMessage());
            
if(tran != null) {
                
try {
                    tran.rollback();
                } 
catch(HibernateException e2) {
                    e2.printStackTrace();
                }
            }
        }
    }
    
    
public void testSelect(){
        String hql 
= " from TUser where age=25 ";
        
try {
            List userList 
= session.createQuery(hql).list();
            TUser user 
= (TUser)userList.get(0);
            Contact contact 
= user.getContact();
            Assert.assertEquals(contact.getAddress(), 
"dalian");
            Assert.assertEquals(user.getName().getFirstname(), 
"yu");
        } 
catch (HibernateException e) {
            
// TODO: handle exception
            e.printStackTrace();
            Assert.fail(e.getMessage());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值