Hibernate一對一數據關聯(一)
對于ORM而言,一個重要的特性就是對實體之間關聯關系的管理。數據關聯是ORM一個重要的特征,但往往也是導致性能低下的原因,在開發中要特別注意這一點。
一對一關聯有兩種類型:主鍵關聯和唯一外鍵關聯
一.主鍵關聯:
一對一主鍵關聯形式,即兩張關聯表通過主鍵形成一對一映射關系。
例如,一個中國公民只能有一份護照。
1.數據模型如下

2.表定義sql
一對一關聯有兩種類型:主鍵關聯和唯一外鍵關聯
一.主鍵關聯:
一對一主鍵關聯形式,即兩張關聯表通過主鍵形成一對一映射關系。
例如,一個中國公民只能有一份護照。
1.數據模型如下

2.表定義sql
DROP
?
TABLE
?T_User;
DROP ? TABLE ?T_Passport;
CREATE ? TABLE ?T_Passport?(
???????id? INT ? NOT ? NULL
?????,?serial? VARCHAR ( 30 )
?????,?expiry? INT
?????,? PRIMARY ? KEY ?(id)
);
CREATE ? TABLE ?T_User?(
???????id? INT ? NOT ? NULL ?AUTO_INCREMENT
?????,?name? VARCHAR ( 50 )
?????,?age? INT
?????,? PRIMARY ? KEY ?(id)
?????,? INDEX ?(id)
?????,? CONSTRAINT ?FK_T_User_1? FOREIGN ? KEY ?(id)
?????????????????? REFERENCES ?T_Passport?(id)
);
DROP ? TABLE ?T_Passport;
CREATE ? TABLE ?T_Passport?(
???????id? INT ? NOT ? NULL
?????,?serial? VARCHAR ( 30 )
?????,?expiry? INT
?????,? PRIMARY ? KEY ?(id)
);
CREATE ? TABLE ?T_User?(
???????id? INT ? NOT ? NULL ?AUTO_INCREMENT
?????,?name? VARCHAR ( 50 )
?????,?age? INT
?????,? PRIMARY ? KEY ?(id)
?????,? INDEX ?(id)
?????,? CONSTRAINT ?FK_T_User_1? FOREIGN ? KEY ?(id)
?????????????????? REFERENCES ?T_Passport?(id)
);
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 ?TPassport?passport;
???? // ?Constructors
???? public ?Integer?getAge()?{
???????? return ?age;
????}
???? public ? void ?setAge(Integer?age)?{
???????? this .age? = ?age;
????}
???? public ?TPassport?getPassport()?{
???????? return ?passport;
????}
???? public ? void ?setPassport(TPassport?passport)?{
???????? this .passport? = ?passport;
????}
???? /** ?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;
????}
}
public ? class ?TUser?? implements ?java.io.Serializable?{
???? // ?Fields????
????? private ?Integer?id;
????? private ?Integer?age;
????? private ?String?name;
????? private ?TPassport?passport;
???? // ?Constructors
???? public ?Integer?getAge()?{
???????? return ?age;
????}
???? public ? void ?setAge(Integer?age)?{
???????? this .age? = ?age;
????}
???? public ?TPassport?getPassport()?{
???????? return ?passport;
????}
???? public ? void ?setPassport(TPassport?passport)?{
???????? this .passport? = ?passport;
????}
???? /** ?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;
????}
}
TPassport.java
package
?cn.blogjava.start;
import ?java.io.Serializable;
public ? class ?TPassport? implements ?Serializable?{
???? private ?Integer?id;
???? private ?String?serial;
???? private ?Integer?expiry;
???? private ?TUser?user;
????
???? public ?Integer?getExpiry()?{
???????? return ?expiry;
????}
???? public ? void ?setExpiry(Integer?expiry)?{
???????? this .expiry? = ?expiry;
????}
???? public ?Integer?getId()?{
???????? return ?id;
????}
???? public ? void ?setId(Integer?id)?{
???????? this .id? = ?id;
????}
???? public ?String?getSerial()?{
???????? return ?serial;
????}
???? public ? void ?setSerial(String?serial)?{
???????? this .serial? = ?serial;
????}
???? public ?TUser?getUser()?{
???????? return ?user;
????}
???? public ? void ?setUser(TUser?user)?{
???????? this .user? = ?user;
????}
????
}
import ?java.io.Serializable;
public ? class ?TPassport? implements ?Serializable?{
???? private ?Integer?id;
???? private ?String?serial;
???? private ?Integer?expiry;
???? private ?TUser?user;
????
???? public ?Integer?getExpiry()?{
???????? return ?expiry;
????}
???? public ? void ?setExpiry(Integer?expiry)?{
???????? this .expiry? = ?expiry;
????}
???? public ?Integer?getId()?{
???????? return ?id;
????}
???? public ? void ?setId(Integer?id)?{
???????? this .id? = ?id;
????}
???? public ?String?getSerial()?{
???????? return ?serial;
????}
???? public ? void ?setSerial(String?serial)?{
???????? this .serial? = ?serial;
????}
???? public ?TUser?getUser()?{
???????? return ?user;
????}
???? public ? void ?setUser(TUser?user)?{
???????? this .user? = ?user;
????}
????
}
3.配置文件
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" ? />
???????? < one-to-one? name ="passport" ?
????????????????????class ="cn.blogjava.start.TPassport" ?
????????????????????cascade ="all" ?
????????????????????outer-join ="true" ?
????????? />
???? </ class >
</ hibernate-mapping >
<! 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" ? />
???????? < one-to-one? name ="passport" ?
????????????????????class ="cn.blogjava.start.TPassport" ?
????????????????????cascade ="all" ?
????????????????????outer-join ="true" ?
????????? />
???? </ class >
</ hibernate-mapping >
TPassport.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.TPassport" ?table ="T_Passport" ?catalog ="sample" >
???????? < id? name ="id" ?type ="integer" ?column ="id" >
???????????? < generator? class ="foreign" >
???????????????? < param? name ="property" > user </ param >
???????????? </ generator > ???????????
???????? </ id >
???????? < property? name ="serial" ?type ="string" ?column ="serial" ? />
???????? < property? name ="expiry" ?type ="java.lang.Integer" ?column ="expiry" ? />
????????
???????? < one-to-one? name ="user" ?
????????????????????class ="cn.blogjava.start.TUser" ?
????????????????????constrained ="true"
????????? />
???? </ class >
</ hibernate-mapping >
<! 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.TPassport" ?table ="T_Passport" ?catalog ="sample" >
???????? < id? name ="id" ?type ="integer" ?column ="id" >
???????????? < generator? class ="foreign" >
???????????????? < param? name ="property" > user </ param >
???????????? </ generator > ???????????
???????? </ id >
???????? < property? name ="serial" ?type ="string" ?column ="serial" ? />
???????? < property? name ="expiry" ?type ="java.lang.Integer" ?column ="expiry" ? />
????????
???????? < one-to-one? name ="user" ?
????????????????????class ="cn.blogjava.start.TUser" ?
????????????????????constrained ="true"
????????? />
???? </ class >
</ hibernate-mapping >
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();
????????}????????
????}????
????
???? public ? void ?testInsert()?{
????????Transaction?tran? = ? null ;
???????? try ?{
????????
????????????TUser?user? = ? new ?TUser();
????????????user.setName( " byf " );
????????????user.setAge( new ?Integer( 26 ));
????????????
????????????TPassport?passport? = ? new ?TPassport();
????????????passport.setSerial( " PCN123456 " );
????????????passport.setExpiry( new ?Integer( 20081010 ));
????????????
???????????? // 設置相互關聯
????????????user.setPassport(passport);
????????????passport.setUser(user);
????????????tran? = ?session.beginTransaction();
????????????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( " passport?serial?NO.?is? " ? + ?user.getPassport().getSerial());
????????????Assert.assertEquals(user.getName(),? " byf " );
????????}? catch ?(Exception?e)?{
????????????e.printStackTrace();
????????????Assert.fail(e.getMessage());
????????}
????}
}
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();
????????}????????
????}????
????
???? public ? void ?testInsert()?{
????????Transaction?tran? = ? null ;
???????? try ?{
????????
????????????TUser?user? = ? new ?TUser();
????????????user.setName( " byf " );
????????????user.setAge( new ?Integer( 26 ));
????????????
????????????TPassport?passport? = ? new ?TPassport();
????????????passport.setSerial( " PCN123456 " );
????????????passport.setExpiry( new ?Integer( 20081010 ));
????????????
???????????? // 設置相互關聯
????????????user.setPassport(passport);
????????????passport.setUser(user);
????????????tran? = ?session.beginTransaction();
????????????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( " passport?serial?NO.?is? " ? + ?user.getPassport().getSerial());
????????????Assert.assertEquals(user.getName(),? " byf " );
????????}? catch ?(Exception?e)?{
????????????e.printStackTrace();
????????????Assert.fail(e.getMessage());
????????}
????}
}