[標題]:Hibernate一對多(雙向)
[時間]:2009-6-17
[摘要]:Hibernate一對多雙向關聯,例如一個用戶有多張銀行卡。
[關鍵字]:雙向關聯,Hibernate,ORM,關系數據庫,映射,一對多
[環境]:MyEclipse7 ,Hibernate3.2
[作者]:Winty (wintys@gmail.com) http://m.tkk7.com/wintys
[正文]:
Hibernate一對多雙向關聯,例如一個用戶有多張銀行卡。雙向一對多關聯在單向一對多(參見"
Hibernate一對多(單向)":http://m.tkk7.com/wintys/archive/2009/06/13/hibernate_onetomany.html)的基礎上,再對"多"方進行配置。
1、概述
a.實體類:
public class User{
...
private Set<Card> cards;
...
}
public class Card{
...
private User user;
...
}
b.Hibernate配置文件
根據需要可以將User.hbm.xml中set的屬性inverse設置為true
User.hbm.xml:
<set name="cards" inverse="true" cascade="all">
<key column="userId" />
<one-to-many class="wintys.hibernate.onetomany.Card" />
</set>
Card.hbm.xml:
<many-to-one name="user"
class="wintys.hibernate.onetomany.User"
column="userId"
cascade="all" />
c.數據庫:
數據庫表與單向一對多時并沒有區別,還是在"多方"加一個外鍵"userId"即可。
2、實體類:
User:
package wintys.hibernate.onetomany;
import java.util.Set;
public class User {
private String id;
private String name;
private Set<Card> cards;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setCards(Set<Card> cards) {
this.cards = cards;
}
public Set<Card> getCards() {
return cards;
}
}
Card:
package wintys.hibernate.onetomany;
public class Card {
private String id;
private float balance;
private User user;/*用于實現反向關聯:"多對一"*/
public Card(){
}
public Card(float balance){
this.balance = balance;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public float getBalance() {
return balance;
}
public void setBalance(float balance) {
this.balance = balance;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3、映射文件:
用戶類映射文件/src/wintys/hibernate/onetomany/User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="wintys.hibernate.onetomany.User" table="myuser" catalog="db">
<id name="id" type="string">
<column name="id" not-null="true"/>
<generator class="uuid.hex" />
</id>
<property name="name" type="java.lang.String" column="name" />
<!-- 當用于實現反向關聯:"多對一"-->
<set name="cards" inverse="true" cascade="all">
<key column="userId" />
<one-to-many class="wintys.hibernate.onetomany.Card" />
</set>
</class>
</hibernate-mapping>
銀行卡映射文件/src/wintys/hibernate/onetomany/User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="wintys.hibernate.onetomany.Card" table="mycard" catalog="db">
<id name="id" type="string">
<column name="id" not-null="true"/>
<generator class="uuid.hex" />
</id>
<property name="balance" />
<!-- 用于實現反向關聯:"多對一" -->
<many-to-one name="user"
class="wintys.hibernate.onetomany.User"
column="userId"
cascade="all" />
</class>
</hibernate-mapping>
4、數據庫表與"單向一對多"相同。
5、Hibernate配置文件:/src/hibernate.cfg.xml也與"單向一對多"相同。
6、使用測試:
/src/wintys/hibernate/onetomany/HibernateUtil.java與"單向一對多"相同。
/src/wintys/hibernate/onetomany/CardDAO.java:
package wintys.hibernate.onetomany;
import java.util.List;
public interface CardDAO {
public void insert();
public List<Card> selectAll();
}
/src/wintys/hibernate/onetomany/CardDAOBean.java:
package wintys.hibernate.onetomany;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class CardDAOBean implements CardDAO {
public void insert() throws HibernateException {
Transaction tc = null;
try{
Card c1,c2,c3;
User user;
Set<Card> cards;
c1 = new Card(7641.96f);
c2 = new Card(654.8f);
c3 = new Card(3650f);
user = new User();
user.setName("Tom");
/*一對多映射*/
cards = new HashSet<Card>();
cards.add(c1);
cards.add(c2);
cards.add(c3);
user.setCards(cards);
/*多對一映射*/
c1.setUser(user);
c2.setUser(user);
c3.setUser(user);
Session session = HibernateUtil.getSession();
tc = session.beginTransaction();
session.save(c1);
session.save(c2);
session.save(c3);
tc.commit();
}catch(HibernateException e){
try{
if(tc != null)
tc.rollback();
}catch(Exception ex){
System.err.println(ex.getMessage());
}
System.err.println(e.getMessage());
}finally{
HibernateUtil.closeSession();
}
}
@SuppressWarnings("unchecked")
public List<Card> selectAll() throws HibernateException {
List<Card> cards = null;
Transaction tc = null;
try{
Session session = HibernateUtil.getSession();
tc = session.beginTransaction();
Query query = session.createQuery("from Card");
cards = query.list();
tc.commit();
}catch(HibernateException e){
try{
if(tc != null){
tc.rollback();
cards = null;
}
}catch(Exception ex){
System.err.println(ex.getMessage());
}
System.err.println(e.getMessage());
}finally{
//HibernateUtil.closeSession();
}
return cards;
}
}
7、運行結果:
控制臺顯示:
......
Hibernate: insert into db.myuser (name, id) values (?, ?)
Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
Hibernate: insert into db.mycard (balance, userId, id) values (?, ?, ?)
Hibernate: update db.mycard set balance=?, userId=? where id=?
Hibernate: update db.mycard set balance=?, userId=? where id=?
Hibernate: update db.mycard set balance=?, userId=? where id=?
......
id:402881e421eddc240121ede9c5d10009
name:Tom
cards:
cardId:402881e421eddc240121ede9c5d1000a
balance:7641.96
cardId:402881e421eddc240121ede9c5d1000c
balance:3650.0
cardId:402881e421eddc240121ede9c5d1000b
balance:654.8
[參考資料]:
《J2EE項目實訓-Hibernate框架技術》 : 清華大學出版社
原創作品,轉載請注明出處。
作者:Winty (wintys@gmail.com)
博客:http://m.tkk7.com/wintys
posted on 2009-06-17 22:04
天堂露珠 閱讀(489)
評論(0) 編輯 收藏 所屬分類:
Hibernate