Posted on 2007-01-08 16:55
帥子 閱讀(2678)
評論(2) 編輯 收藏 所屬分類:
j2se技術專區
Hibernate一對一數據關聯(二) 唯一外鍵關聯
一.單向一對一關聯
1.數據模型如下圖所示:

2.數據表sql
DROP?TABLE?T_User;
DROP?TABLE?T_Group;
CREATE?TABLE?T_Group?(
???????id?INT?NOT?NULL?AUTO_INCREMENT
?????,?name?VARCHAR(50)
?????,?PRIMARY?KEY?(id)
);
CREATE?TABLE?T_User?(
???????id?INT?NOT?NULL?AUTO_INCREMENT
?????,?name?VARCHAR(50)
?????,?age?INT
?????,?group_id?INT?NOT?NULL
?????,?PRIMARY?KEY?(id)
?????,?INDEX?(group_id)
?????,?CONSTRAINT?FK_T_User_1?FOREIGN?KEY?(group_id)
??????????????????REFERENCES?T_Group?(id)
);
</DIV>
3.POJO類
TUser.java
package?cn.blogjava.start;
public?class?TUser??implements?java.io.Serializable?{
????//?Fields????
?????private?Integer?id;
?????private?Integer?age;
?????private?String?name;
?????private?TGroup?group;
????//?Constructors
????public?Integer?getAge()?{
????????return?age;
????}
????public?void?setAge(Integer?age)?{
????????this.age?=?age;
????}
????public?TGroup?getGroup()?{
????????return?group;
????}
????public?void?setGroup(TGroup?group)?{
????????this.group?=?group;
????}
????/**?default?constructor?*/
????public?TUser()?{
????}
????
????/**?constructor?with?id?*/
????public?TUser(Integer?id)?{
????????this.id?=?id;
????}
????//?Property?accessors
????public?Integer?getId()?{
????????return?this.id;
????}
????
????public?void?setId(Integer?id)?{
????????this.id?=?id;
????}
????public?String?getName()?{
????????return?this.name;
????}
????
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
}TGroup.java
package?cn.blogjava.start;
import?java.io.Serializable;
public?class?TGroup?implements?Serializable?{
????
????private?Integer?id;
????private?String?name;
????
????public?Integer?getId()?{
????????return?id;
????}
????public?void?setId(Integer?id)?{
????????this.id?=?id;
????}
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????
}
</DIV>
3.配置文件
hibernate.cfg.xml
<?xml?version="1.0"?encoding="UTF-8"?>
<!DOCTYPE?hibernate-configuration?PUBLIC
????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"
????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
????<session-factory>
????????<property?name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
????????<property?name="hibernate.connection.password">1234</property>
????????<property?name="hibernate.connection.url">jdbc:mysql://localhost:3306/sample</property>
????????<property?name="hibernate.connection.username">root</property>
????????<property?name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
????????<mapping?resource="cn/blogjava/start/TUser.hbm.xml"?/>
????????<mapping?resource="cn/blogjava/start/TGroup.hbm.xml"?/>????????
????</session-factory>
</hibernate-configuration>
</DIV>
TGroup.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>
????<class?name="cn.blogjava.start.TGroup"?table="T_Group"?catalog="sample">
????????<id?name="id"?type="integer">
????????????<column?name="id"?/>
????????????<generator?class="native"?/>
????????</id>
????????<property?name="name"?type="string"?column="name"?/>
????</class>
</hibernate-mapping>
</DIV>
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>
????<class?name="cn.blogjava.start.TUser"?table="T_User"?catalog="sample">
????????<id?name="id"?type="integer">
????????????<column?name="id"?/>
????????????<generator?class="native"?/>
????????</id>
????????<property?name="name"?type="string">
????????????<column?name="name"?length="100"?not-null="true"?/>
????????</property>
????????<property?name="age"?type="java.lang.Integer"?column="age"?/>
????????<many-to-one?name="group"?
????????????????????class="cn.blogjava.start.TGroup"?
????????????????????column="GROUP_ID"
??????????????????? cascade="all"
????????????????????unique="true"?
?????????/>
????</class>
</hibernate-mapping>
</DIV>
4.測試代碼
package?cn.blogjava.start;

import?java.util.List;

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

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


public?class?HibernateTest?extends?TestCase?{
????
????Session?session?=?null;

????protected?void?setUp()?{
????????try?{
????????????Configuration?config?=?new?Configuration().configure();
????????????SessionFactory?sessionFactory?=?config.buildSessionFactory();
????????????session?=?sessionFactory.openSession();
????????????
????????}?catch?(HibernateException?e)?{
????????????e.printStackTrace();
????????}????????
????}

????protected?void?tearDown()?{
????????try?{
????????????session.close();????????
????????}?catch?(HibernateException?e)?{
????????????e.printStackTrace();
????????}????????
????}????
????
????/**
?????*?對象持久化測試(Insert方法)
?????*/????????
????public?void?testInsert()?{
????????Transaction?tran?=?null;
????????try?{
????????
????????????TUser?user?=?new?TUser();
????????????user.setName("byf");
????????????user.setAge(new?Integer(26));
????????????
????????????TGroup?group?=?new?TGroup();
????????????group.setName("Admin");
????????????
?????????????? // 如果在配置文件中沒有cascade="all",就要先插入group信息
???????????//?tran?=?session.beginTransaction();????????????
???????????//?session.save(group);
???????????//?session.flush();
???????????//?tran.commit();
????????????????????????
????????????tran?=?session.beginTransaction();????????????????????
????????????//設置關聯
????????????user.setGroup(group);

?????????????? //插入user信息
????????????session.save(user);
????????????session.flush();
????????????tran.commit();
????????????Assert.assertEquals(user.getId().intValue()>0?,true);
????????}?catch?(HibernateException?e)?{
????????????e.printStackTrace();
????????????Assert.fail(e.getMessage());
????????????if(tran?!=?null)?{
????????????????try?{
????????????????????tran.rollback();
????????????????}?catch?(Exception?e1)?{
????????????????????e1.printStackTrace();
????????????????}
????????????}
????????}
????}
????
????/**
?????*?對象讀取測試(Select方法)
?????*/????????????
????public?void?testSelect(){
????????String?hql?=?"?from?TUser?where?name='byf'";
????????try?{
????????????List?userList?=?session.createQuery(hql).list();
????????????TUser?user?=?(TUser)userList.get(0);
????????????System.out.println("user?name?is?"?+?user.getName());
????????????System.out.println("user?group?is?"?+?user.getGroup().getName());
????????????Assert.assertEquals(user.getName(),?"byf");
????????}?catch?(Exception?e)?{
????????????e.printStackTrace();
????????????Assert.fail(e.getMessage());
????????}
????}
}