分享Java快乐

我有一份快乐,分给你一些;我还是有一份快乐,你也有一份快乐。

mxj ID:javamxj
510580次访问,排名74好友0人,关注者2
javamxj的文章
原创 82 篇
翻译 0 篇
转载 0 篇
评论 717 篇
javamxj的公告

    版权声明:在此发表的有关文章均属本人javamxj原创,转摘或引用请注明出处。



联系方式:
Email:
javamxj@gmail.com

友情Blog

最近评论
xkpkhu:wow power leveling
xkpkhu:wow power leveling
xkpkhu:wow power leveling
zhouxz1026:写得真是太好了,水平真的很高,佩服啊!赞一个!学习了!
蜂胶
蜂蜜
hitprince:谢谢啦,知道了
文章分类
收藏
    相册
    有空逛逛
    java开源大全(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Eclipse快速上手Hibernate--5. 组件映射收藏

    新一篇: Draw2D--序言

     
       这篇文章主要说的是在Hibernate中的组件(Component)映射,可以参考Hibernate官方文档的第7章。至于环境设置,可以参考这个系列的前面几篇文章。
     
     
    1. 创建项目
     
    ·  新建一个Java项目:ComponentMapping,注意选中“创建单独的源文件夹和输出文件夹”,同时添加“用户库”:hibernate。 
     
     
    2. 编写类文件
     
    ·  新建一个类,包名:javamxj.hibernate.component,类名:Person。

    Person.java

    /*
     * Hibernate - 组件(Component)映射
     * 创建日期 2005-4-10
     * @author javamxj(分享java快乐)
     * @link  Blog: htpp://javamxj.mblogger.cn  
     *              htpp://blog.csdn.net/javamxj/ 
     */
    package javamxj.hibernate.component;
    /**
     * @hibernate.class
     */
    public class Person {
    	private Long id;
    	private String username;
    	private Address address;
    	
    	/**
    	 * @hibernate.id 
    	 *	generator-class="hilo" 
    	 *	unsaved-value="null"
    	 */
    	public Long getId() {return id;}
    	public void setId(Long id) {this.id = id;}
    	
    	/**
    	 * @hibernate.property 
    	 * 	length="15"
    	 *  unique="true"
    	 * 	not-null="true"
    	 */
    	public String getUsername() {return username;}
    	public void setUsername(String username) {this.username = username;}
    	
    	/**
    	 * @hibernate.component
    	 */
    	public Address getAddress() {return address;}
    	public void setAddress(Address address) {this.address = address;}
    }
    
    ·  Person类调用了Address类,注意在“getAddress()”方法上的“ @hibernate.component”标记。
     
    ·  Address类只含有一些“ @hibernate.property”标记,没有将其独立映射为一个表。

    Address.java

    package javamxj.hibernate.component;
    
    public class Address {
    	private String country;
    	private String city;
    	private String street;
    	private String zipCode;
    	
    	public Address() {}
    	public Address(String country, String city, String street, String zipcode) {
    		super();
    		this.country = country;
    		this.city = city;
    		this.street = street;
    		this.zipCode = zipcode;
    	}
    
    	/**
    	 * @hibernate.property
    	 *  length = "12"
    	 */
    	public String getCity() {return city;}
    	public void setCity(String city) {this.city = city;}
    	
    	/**
    	 * @hibernate.property
    	 *  length = "12"
    	 */
    	public String getCountry() {return country;}
    	public void setCountry(String country) {this.country = country;}
    	
    	/**
    	 * @hibernate.property
    	 *  length = "6"
    	 */
    	public String getZipCode() {return zipCode;}
    	public void setZipCode(String number) {this.zipCode = number;}
    	
    	/**
    	 * @hibernate.property
    	 *  length = "12"
    	 */
    	public String getStreet() {return street;}
    	public void setStreet(String street) {this.street = street;}
    	
    	public String toString(){
    		return ("居住在"+ country + city+"市"+ street+"区"
    			  +	"\n\t邮政编码: "+ zipCode);
    	}
    
    }
    
     
     
    3. 运行任务
     
    ·  复制《Eclipse快速上手Hibernate--4. 继承映射(1)》文中的build.xml到项目目录下。
    ·  双击“generate-hbm”任务,会发现在包中多了一个Animal.hbm.xml文件,在src目录下会多了一个hibernate.cfg.xml文件,如果没有,按F5键刷新一下。

    Person.hbm.xml

    <?xml version="1.0" encoding="GBK"?>
    
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
    
    <hibernate-mapping
    >
        <class
            name="javamxj.hibernate.component.Person"
            dynamic-update="false"
            dynamic-insert="false"
            select-before-update="false"
            optimistic-lock="version"
        >
    
            <id
                name="id"
                column="id"
                type="java.lang.Long"
                unsaved-value="null"
            >
                <generator class="hilo">
                  <!--  
                      To add non XDoclet generator parameters, create a file named 
                      hibernate-generator-params-Person.xml 
                      containing the additional parameters and place it in your merge dir. 
                  --> 
                </generator>
            </id>
    
            <property
                name="username"
                type="java.lang.String"
                update="true"
                insert="true"
                access="property"
                column="username"
                length="15"
                not-null="true"
                unique="true"
            />
    
            <component
                name="address"
                class="javamxj.hibernate.component.Address"
            >
            <property
                name="city"
                type="java.lang.String"
                update="true"
                insert="true"
                access="property"
                column="city"
                length="12"
            />
    
            <property
                name="country"
                type="java.lang.String"
                update="true"
                insert="true"
                access="property"
                column="country"
                length="12"
            />
    
            <property
                name="zipCode"
                type="java.lang.String"
                update="true"
                insert="true"
                access="property"
                column="zipCode"
                length="6"
            />
    
            <property
                name="street"
                type="java.lang.String"
                update="true"
                insert="true"
                access="property"
                column="street"
                length="12"
            />
    
            </component>
    
            <!--
                To add non XDoclet property mappings, create a file named
                    hibernate-properties-Person.xml
                containing the additional properties and place it in your merge dir.
            -->
    
        </class>
    
    </hibernate-mapping>
    
     
     
    · 运行MySql服务器,然后双击“schemaexport”任务,在项目根目录下,会产生一个“schema-export.sql”文件。
    schema-export.sql
    drop table if exists Person
    drop table if exists hibernate_unique_key
    create table Person (
       id bigint not null,
       username varchar(15) not null unique,
       city varchar(12),
       country varchar(12),
       zipCode varchar(6),
       street varchar(12),
       primary key (id)
    )
    create table hibernate_unique_key (
        next_hi integer 
    )
    insert into hibernate_unique_key values ( 0 )
     
    ·  切换到数据库中,会发现已经自动产生了数据表Person
     
    5. 测试程序
     
    ●   这一次不同于前面的几个实例,这次先实现一个HibernateUtil辅助类,用来管理Hibernate的Session,这样测试类的代码就比较简单了,可以参考Hibernate官方文档的第1章。
     
    ·  新建一个类,包名:javamxj.hibernate.util,类名:HibernateUtil,代码如下:

    HibernateUtil.java

    package javamxj.hibernate.util;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.Transaction;
    import net.sf.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
    
    	private static Log log = LogFactory.getLog(HibernateUtil.class);
    
    	private static SessionFactory sessionFactory;
    
    	private static final ThreadLocal threadSession = new ThreadLocal();
    
    	private static final ThreadLocal threadTransaction = new ThreadLocal();
    
    	public static SessionFactory getSessionFactory() {
    		if (sessionFactory == null) {
    			try {
    				// Create the SessionFactory
    				sessionFactory = new Configuration().configure()
    						.buildSessionFactory();
    			} catch (HibernateException ex) {
    				ex.printStackTrace();
    				throw new RuntimeException("Configuration problem: "
    						+ ex.getMessage(), ex);
    			}
    		}
    		return sessionFactory;
    	}
    
    	public static Session currentSession() throws HibernateException {
    		Session s = (Session) threadSession.get();
    		// Open a new Session, if this Thread has none yet
    		if (s == null) {
    			s = getSessionFactory().openSession();
    			log.debug("###Opening new Session for this thread:" + s);
    			threadSession.set(s);
    		} else {
    			log.debug("###Session was existed:" + s);
    		}
    		return s;
    	}
    
    	public static void closeSession() throws HibernateException {
    		Session s = (Session) threadSession.get();
    		threadSession.set(null);
    		if (s != null) {
    			log.debug("###Closing Session of this thread. " + s);
    			s.close();
    		}
    	}
    
    	public static void beginTransaction() throws HibernateException {
    		Transaction tx = (Transaction) threadTransaction.get();
    		try {
    			if (tx == null) {
    				tx = currentSession().beginTransaction();
    				log.debug("###Starting new database transaction in this thread:"+ tx);
    				threadTransaction.set(tx);
    			} else {
    				log.debug("###Tx was existed:" + tx);
    			}
    		} catch (HibernateException ex) {
    			throw ex;
    		}
    	}
    
    	public static void commitTransaction() throws HibernateException {
    		Transaction tx = (Transaction) threadTransaction.get();
    		try {
    			if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
    				log.debug("###Committing database transaction of this thread.");
    				tx.commit();
    			}
    			threadTransaction.set(null);
    		} catch (HibernateException ex) {
    			rollbackTransaction();
    			throw ex;
    		}
    	}
    
    	public static void rollbackTransaction() throws HibernateException {
    		Transaction tx = (Transaction) threadTransaction.get();
    		try {
    			threadTransaction.set(null);
    			if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
    				log.debug("###Tyring to rollback database transaction of this thread.");
    				tx.rollback();
    			}
    		} catch (HibernateException ex) {
    			throw ex;
    		} finally {
    			closeSession();
    		}
    	}
    
    }
    
     
     
    ·  好了,然后在包javamxj.hibernate.component下新建一个ComponentDemo.java类。

    ComponentDemo.java

    package javamxj.hibernate.component;
    
    import java.util.Iterator;
    import java.util.List;
    
    import javamxj.hibernate.util.HibernateUtil;
    
    
    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Session;
    
    public class ComponentDemo {
    	public static void main(String[] args) {
    		try {
    			new ComponentDemo();
    		} catch (HibernateException he) {
    			he.printStackTrace();
    		}
    	}
    
    	public ComponentDemo() throws HibernateException {
    
    		Session sess = HibernateUtil.currentSession();
    
    		Person p = new Person();
    		p.setAddress(new Address("中国", "上海", "普陀", "200055"));
    		p.setUsername("JavaMXJ");
    		sess.save(p);
    
    		p = new Person();
    		p.setAddress(new Address("中国", "北京", "海淀", "100086"));
    		p.setUsername("张三");
    		sess.save(p);
    
    		List animals = sess.find("from " + Person.class.getName());
    		for (Iterator it = animals.iterator(); it.hasNext();) {
    			Person person = (Person) it.next();
    			System.out.println(person.getUsername() + ":" + person.getAddress());
    		}
    		
    		HibernateUtil.closeSession();
    
    	}
    }
    
     
    ·  运行这个类,控制台输出如下:
     
    ·  同时,数据表中生成如下数据:
     
    ·  最后的项目结构如下:
     
     
     

    发表于 @ 2005年04月13日 23:27:00|评论(loading...)|编辑

    旧一篇: Eclipse快速上手Hibernate--4. 继承映射(3)

    评论

    #javamxj 发表于2005-04-27 22:26:00  IP:
    TrackBack来自《Eclipse快速上手Hibernate--5. 关联映射(一对一) 》

    Ping Back来自:blog.csdn.net
    #javamxj 发表于2005-04-27 22:30:00  IP:
    TrackBack来自《Eclipse快速上手Hibernate--5. 关联映射(一对一) 》

    Ping Back来自:blog.csdn.net
    #javamxj 发表于2005-04-27 22:30:00  IP:
    TrackBack来自《Eclipse快速上手Hibernate--5. 关联映射(一对一) 》

    Ping Back来自:blog.csdn.net
    #TeffGuo 发表于2005-04-28 12:15:00  IP:
    TrackBack来自《Eclipse快速上手Hibernate--5. 关联映射(一对一) 》

    Ping Back来自:blog.csdn.net
    #zesila_80 发表于2005-06-22 09:40:00  IP:
    TrackBack来自《Eclipse快速上手Hibernate--6. 关联映射(一对一)》

    Ping Back来自:blog.csdn.net
    #icejava 发表于2006-06-16 13:47:00  IP: 211.100.21.*
    TrackBack来自《Eclipse快速上手Hibernate--5. 组件映射 》

    Eclipse快速上手Hibernate--5. 组件映射
    #helpme 发表于2005-04-25 16:54:00  IP: 59.37.16.*
    好文,老大能不能写一下关于组件的一对多,多对多的关系,期待中!~~
    #huaguol 发表于2005-04-27 17:14:00  IP: 211.155.226.*
    按照你的步骤我操作了一遍:就是数据库表中没有数据,结果也跟你的输出一样的.请javamxj指点一下!
    #阿义 发表于2005-05-03 04:14:00  IP: 218.2.173.*
    呵呵,我数据库里不能得到汉字部分。不知道该如何编码
    #好好 发表于2005-05-16 13:58:00  IP: 198.169.188.*
    执行完数据库中没有数据。在ComponentDemo中save之前添加语句:

    HibernateUtil.beginTransaction();

    save之后,添加:

    HibernateUtil.commitTransaction();
    #Anubis 发表于2006-01-16 12:55:00  IP: 222.33.36.*
    好象没有提及优缺点
    #hongai 发表于2006-02-25 20:55:00  IP: 220.115.11.*
    衣问在哪里能下载得到Hibernate的包
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © javamxj