一对多关联映射(单向关联)见项目:me_one_to_many
生活随笔
收集整理的這篇文章主要介紹了
一对多关联映射(单向关联)见项目:me_one_to_many
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.
模型
一個用戶組(group)對應多個用戶。
2.
實體類(省略set,get方法)
public class User {
private int id;
private String name;
}
public class Group {
private int id;
private String name;
private Set Users;
}
3.
數據模型
mysql> desc t_user;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| groupid | int(11) | YES | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
mysql> desc t_group;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
4.
映射文件
一個用戶組對應多個用戶。
多對一關聯映射:是在"多"的一端添加一個外鍵指向"一"的一端,它維護的關系為多到一的關系,如:當載入一個用戶(user)時將載入組(group)的信息。
一對多關聯映射:是在"多"的一端添加一個外鍵指向"一"的一端,它維護的關系為一到多的關系,如:當載入一個組(group)時將載入此組用戶的信息。
可以說,一對多和多對一的映射策略是一致的,都是通過在"多"的一端添加一個外鍵指向"一"的一端,只是站的角度不同。
User.hbm.xml:
<hibernate-mapping>
<class name="com.dvnchina.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
Group.hbm.xml:
<hibernate-mapping>
<class name="com.dvnchina.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- <set name="users" cascade="all">-->
<set name="users" order-by="name">
<key column="groupid"/>
<one-to-many class="com.dvnchina.hibernate.User"/>
</set>
</class>
</hibernate-mapping>
5.
測試
public class TestOneToMany extends TestCase {
public void testSave(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Set<User> users = new HashSet<User>();
for(int i=0;i<9;i++){
User user = new User();
user.setName("yang"+i);
//session.save(user);
users.add(user);
}
//當user沒有save,即為Transient對象,將拋出TransientObjectException
//因為持久對象不能直接引用瞬時對象,所以我們需要先save(user)使其為持久對象后
//再引用
Group group = new Group();
group.setName("鳳山人在線");
group.setUsers(users);
session.save(group);
tx.commit();
HibernateUtils.closeSession(session);
}
public void testCascade(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Set<User> users = new HashSet<User>();
for(int i=0;i<9;i++){
User user = new User();
user.setName("yang"+i);
users.add(user);
}
//在user.hbm.xml中的one-to-many中設置級聯設置cascade="all",此時不需要使user
//為持久對象而可以直接使用它,因為save(group)時將級聯保存user
Group group = new Group();
group.setName("鳳山人在線");
group.setUsers(users);
session.save(group);
tx.commit();
HibernateUtils.closeSession(session);
}
//級聯是對象之間的連鎖操作(只對增刪改起作用,對load不起作用,load是由one-to-many維護的)
public void testLoad(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Group group = (Group) session.load(Group.class, 2);
Set list = group.getUsers();
for(Iterator ite = list.iterator();ite.hasNext();){
User user = (User) ite.next();
System.out.println(group.getName()+","+user.getName());
}
tx.commit();
HibernateUtils.closeSession(session);
}
}
本文轉自 yzzh9 51CTO博客,原文鏈接:http://blog.51cto.com/java999/119432,如需轉載請自行聯系原作者
模型
一個用戶組(group)對應多個用戶。
2.
實體類(省略set,get方法)
public class User {
private int id;
private String name;
}
public class Group {
private int id;
private String name;
private Set Users;
}
3.
數據模型
mysql> desc t_user;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| groupid | int(11) | YES | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
mysql> desc t_group;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
4.
映射文件
一個用戶組對應多個用戶。
多對一關聯映射:是在"多"的一端添加一個外鍵指向"一"的一端,它維護的關系為多到一的關系,如:當載入一個用戶(user)時將載入組(group)的信息。
一對多關聯映射:是在"多"的一端添加一個外鍵指向"一"的一端,它維護的關系為一到多的關系,如:當載入一個組(group)時將載入此組用戶的信息。
可以說,一對多和多對一的映射策略是一致的,都是通過在"多"的一端添加一個外鍵指向"一"的一端,只是站的角度不同。
User.hbm.xml:
<hibernate-mapping>
<class name="com.dvnchina.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
Group.hbm.xml:
<hibernate-mapping>
<class name="com.dvnchina.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- <set name="users" cascade="all">-->
<set name="users" order-by="name">
<key column="groupid"/>
<one-to-many class="com.dvnchina.hibernate.User"/>
</set>
</class>
</hibernate-mapping>
5.
測試
public class TestOneToMany extends TestCase {
public void testSave(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Set<User> users = new HashSet<User>();
for(int i=0;i<9;i++){
User user = new User();
user.setName("yang"+i);
//session.save(user);
users.add(user);
}
//當user沒有save,即為Transient對象,將拋出TransientObjectException
//因為持久對象不能直接引用瞬時對象,所以我們需要先save(user)使其為持久對象后
//再引用
Group group = new Group();
group.setName("鳳山人在線");
group.setUsers(users);
session.save(group);
tx.commit();
HibernateUtils.closeSession(session);
}
public void testCascade(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Set<User> users = new HashSet<User>();
for(int i=0;i<9;i++){
User user = new User();
user.setName("yang"+i);
users.add(user);
}
//在user.hbm.xml中的one-to-many中設置級聯設置cascade="all",此時不需要使user
//為持久對象而可以直接使用它,因為save(group)時將級聯保存user
Group group = new Group();
group.setName("鳳山人在線");
group.setUsers(users);
session.save(group);
tx.commit();
HibernateUtils.closeSession(session);
}
//級聯是對象之間的連鎖操作(只對增刪改起作用,對load不起作用,load是由one-to-many維護的)
public void testLoad(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Group group = (Group) session.load(Group.class, 2);
Set list = group.getUsers();
for(Iterator ite = list.iterator();ite.hasNext();){
User user = (User) ite.next();
System.out.println(group.getName()+","+user.getName());
}
tx.commit();
HibernateUtils.closeSession(session);
}
}
附件:http://down.51cto.com/data/2351411
本文轉自 yzzh9 51CTO博客,原文鏈接:http://blog.51cto.com/java999/119432,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的一对多关联映射(单向关联)见项目:me_one_to_many的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nagios监控三部曲之——nagios
- 下一篇: VISTA中释放系统还原占用的硬盘空间