設置上與User.hbm.xml是類似的,只是增加了inverse="true",表示將關係的維護交由另一端,注意我們在User與Server的cascade都是設置為save-update,在多對多的關係中,all、delete等cascade是沒有意義的,因為多對多中,並不能因為父物件被刪除,而造成被包括的子物件被刪除,因為可能還有其它的父物件參考至這個子物件。
我們使用下面這個程式來測試:
java 代码
import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateTest {
public static void main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Server server1 = new Server();
server1.setAddress("PC-219");
Server server2 = new Server();
server2.setAddress("PC-220");
Server server3 = new Server();
server3.setAddress("PC-221");
User user1 = new User();
user1.setName("caterpillar");
User user2 = new User();
user2.setName("momor");
user1.getServers().add(server1);
user1.getServers().add(server2);
user1.getServers().add(server3);
server1.getUsers().add(user1);
server2.getUsers().add(user1);
server3.getUsers().add(user1);
user2.getServers().add(server1);
user2.getServers().add(server3);
server1.getUsers().add(user2);
server3.getUsers().add(user2);
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.save(user1);
session.save(user2);
tx.commit();
session.close();
sessionFactory.close();
}
}
注意由於設定了inverse="true",所以必須分別設定User與Server之間的相互參考,來看看實際上資料庫中是如何儲存的:
select * FROM USER
+---------+-------------+
| USER_ID | NAME |
+---------+-------------+
| 1 | caterpillar |
| 2 | momor |
+---------+-------------+
select * FROM USER_SERVER
+-----------------+--------------+
| SERVER_ID | USER_ID |
+-----------------+--------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| 2 | 2 |
+-----------------+--------------+
select * FROM SERVER
+-----------------+------------+
| SERVER_ID | address |
+-----------------+------------+
| 1 | PC-219 |
| 2 | PC-221 |
| 3 | PC-220 |
+-----------------+-------------+
该文章转载自德仔工作室:http://www.dezai.cn/Article_Show.asp?ArticleID=20506&ArticlePage=2