前几天学习hibernate ,使用eclipse上面的插件(hibrenatesyn),在网上看了点资料,发现www.hibernate.org.cn不错,不过就是 hibernate入门篇之新增特性_2:one-to-one(http://www.hibernate.org.cn/64.html)不是很详细,试了好长时间没有成功,而且作者对数据库也没有做设计,我想给初学者做个例子: 其实one-to-one在hibernate 的发布doc里面有很详细的说明,具体见 41页(chinese version)。根据doc,其实有两种方式实现 one to one.我就其中的一种示范下。(使用 many to one )hehe,我感觉只要一种可以实现的话,一般其他不成问题了,就怕一开始就失败了,那就没有学习的积极性了。
一.数据库设计:--我使用sqlserver 表1 person 字段 person_id key int email varchar(50) name varchar(50) 表2 author 字段 author_id key int alias varchar(50) person_id int foreign key 很简单的关系,具体在sqlserver里面怎么设表 我就不说了。
二.eclipse 里面使用 hibernatesyn等工具 我也不讲了,网上有很多这方面的资料的。不过,我有个问题:我使用hibernatesyn一开始 生成 * .hbm文件(也就是mapping )后,如果我数据库需要修改,我只能直接修改*.hbm文件,没有工具能直接update mapping,要是各位知道有该功能请告诉我啊。thanks!
三.hibernate.cfg.xml文件: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration> <session-factory> <!-- local connection properties --> <property name="hibernate.connection.url"> jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test;SelectMethod=cursor </property> <property name="hibernate.connection.driver_class"> com.microsoft.jdbc.sqlserver.SQLServerDriver </property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password">scroll</property> <!-- property name="hibernate.connection.pool_size"></property --> <!-- dialect for Microsoft SQL Server --> <property name="dialect"> net.sf.hibernate.dialect.SQLServerDialect </property> <property name="hibernate.show_sql">true</property> <property name="hibernate.use_outer_join">true</property> <!-- property name="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JTATransactionFactory</property> <property name="jta.UserTransaction">java:comp/UserTransaction</property //--> <mapping resource="com/tjlog/po/Person.hbm" /> <mapping resource="com/tjlog/po/Author.hbm" /> </session-factory> </hibernate-configuration> 注意:我把 <!-- property name="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JTATransactionFactory</property> <property name="jta.UserTransaction">java:comp/UserTransaction</property //--> 注释了,因为我是直接使用JDBC的,如果不注释就报错!
四.person.hbm <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="com.tjlog.po"> <class name="Person" table="PERSON" > <id name="Id" type="java.lang.Integer" column="Person_Id" > <generator class="identity" /> </id>
<property name="Email" column="Email" type="string" not-null="false" length="100" /> <property name="Name" column="Name" type="string" not-null="false" length="100" />
</class> </hibernate-mapping>
五.author.hbm <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="com.tjlog.po"> <class name="Author" table="AUTHOR"> <id column="Author_Id" name="Id" type="java.lang.Integer" > <generator class="identity" /> </id> <property column="Alias" length="100" name="Alias" not-null="false" type="string" /> <many-to-one cascade="all" class="com.tjlog.po.Person" column="Person_Id" name="person" not-null="true" outer-join="auto" /> </class> </hibernate-mapping>
六.测试类 CommonExample (其实可以使用 HibernateUtil.java 的,仅测试,如果需要在实际使用,则就需要DAO封装) /* * 创建日期 2005-1-24 * */ package com.tjlog.example;
/** * @author Administrator * @CorpRight DongYiPing */ import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*;
import com.tjlog.po.*;
public class CommonExample { public CommonExample() {} public static void main(String[] args) { List list; try { Configuration cfg = new Configuration().configure(); SessionFactory sessions = cfg.buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); Person person = new Person(); person.setName("DongYiPing"); person.setEmail([email protected]); Author author = new Author();
author.setAlias("pingping"); author.setPerson(author);
session.saveOrUpdate(person); tx.commit(); session.close(); } catch (Exception e) { System.out.println(e); } } }
在我机器数据插入成功!
If u have anything about this test application,u can ask me by email :[email protected]. I am also the fresh man of hibernate.

|