hibernate3学习笔记(二十)|关系映射:多对多

来源:互联网 发布:淘宝拍摄模特 编辑:程序博客网 时间:2024/05/21 19:55
 要实现多对多的对应,一般可以借由一个中间表来完成。也就是借由一对多,多对一来完成。

DDL:

  1. CREATE TABLE user (
  2.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  3.     name VARCHAR(100) NOT NULL default ''
  4. );
  5. CREATE TABLE user_server (
  6.     user_id INT(11),
  7.     server_id INT(11)
  8. );
  9. CREATE TABLE server (
  10.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  11.     address VARCHAR(100) NOT NULL default ''
  12. );

User.java

  1. package com.hb3.pack_19.model;
  2. import java.util.Set;
  3. public class User {
  4.     
  5.     private Integer id;
  6.     private String name;
  7.     private Set<Server> servers;
  8.     
  9.     public User() {
  10.     }
  11.     public Integer getId() {
  12.         return id;
  13.     }
  14.     public void setId(Integer id) {
  15.         this.id = id;
  16.     }
  17.     public String getName() {
  18.         return name;
  19.     }
  20.     public void setName(String name) {
  21.         this.name = name;
  22.     }
  23.     public Set<Server> getServers() {
  24.         return servers;
  25.     }
  26.     public void setServers(Set<Server> servers) {
  27.         this.servers = servers;
  28.     }
  29. }

Server.java

  1. package com.hb3.pack_19.model;
  2. import java.util.Set;
  3. public class Server {
  4.     private Integer id;
  5.     private String address;
  6.     private Set<User> users;
  7.     
  8.     public String getAddress() {
  9.         return address;
  10.     }
  11.     public void setAddress(String address) {
  12.         this.address = address;
  13.     }
  14.     public Integer getId() {
  15.         return id;
  16.     }
  17.     public void setId(Integer id) {
  18.         this.id = id;
  19.     }
  20.     public Set<User> getUsers() {
  21.         return users;
  22.     }
  23.     public void setUsers(Set<User> users) {
  24.         this.users = users;
  25.     }
  26. }

Server.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping> 
  6.     <class name="com.hb3.pack_19.model.Server" table="server"> 
  7.         <id name="id" column="id"> 
  8.             <generator class="native"/> 
  9.         </id> 
  10.         <property name="address" type="java.lang.String"/> 
  11.         
  12.         <set name="users" 
  13.              table="user_server" 
  14.              inverse="true" 
  15.              cascade="save-update"> 
  16.               
  17.              <key column="server_id"/> 
  18.              <many-to-many class="com.hb3.pack_19.model.User" 
  19.                            column="user_id"/> 
  20.         </set> 
  21.     </class> 
  22. </hibernate-mapping>

User.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping> 
  6.     <class name="com.hb3.pack_19.model.User" table="user">
  7.      
  8.         <id name="id" column="id" type="java.lang.Integer"> 
  9.             <generator class="native"/> 
  10.         </id> 
  11.         <property name="name" column="name" type="java.lang.String"/> 
  12.         <set name="servers" 
  13.              table="user_server" 
  14.              cascade="save-update"> 
  15.              
  16.             <key column="user_id"/> 
  17.             <many-to-many class="com.hb3.pack_19.model.Server" 
  18.                           column="server_id"/>            
  19.         </set> 
  20.     </class> 
  21. </hibernate-mapping>

测试代码:

  1. package com.hb3.pack_19;
  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import java.util.HashSet;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.Transaction;
  8. import org.hibernate.cfg.Configuration;
  9. import com.hb3.pack_19.model.Server;
  10. import com.hb3.pack_19.model.User;
  11. public class BusinessService {
  12.     public static void main(String[] args) throws IOException, SQLException {
  13.         
  14.         Configuration config = new Configuration().configure();
  15.         SessionFactory sessionFactory = config.buildSessionFactory();      
  16.         Session session = sessionFactory.openSession();
  17.         
  18.         Server server1 = new Server();
  19.         server1.setAddress("PC-219"); 
  20.         server1.setUsers(new HashSet<User>());
  21.         Server server2 = new Server(); 
  22.         server2.setAddress("PC-220"); 
  23.         server2.setUsers(new HashSet<User>());
  24.      
  25.         Server server3 = new Server(); 
  26.         server3.setAddress("PC-221");
  27.         server3.setUsers(new HashSet<User>());
  28.      
  29.         User user1 = new User(); 
  30.         user1.setName("shenbin");
  31.         user1.setServers(new HashSet<Server>());
  32.      
  33.         User user2 = new User(); 
  34.         user2.setName("chenyan");
  35.         user2.setServers(new HashSet<Server>());
  36.         user1.getServers().add(server1); 
  37.         user1.getServers().add(server2); 
  38.         user1.getServers().add(server3); 
  39.         server1.getUsers().add(user1); 
  40.         server2.getUsers().add(user1); 
  41.         server3.getUsers().add(user1); 
  42.         user2.getServers().add(server1); 
  43.         user2.getServers().add(server3); 
  44.         server1.getUsers().add(user2); 
  45.         server3.getUsers().add(user2); 
  46.                 
  47.         Transaction tx= session.beginTransaction(); 
  48.         session.save(user1); 
  49.         session.save(user2);                 
  50.         tx.commit();
  51.         session.close();
  52.         sessionFactory.close();
  53.     }
  54. }

但是,多对多映射由于使用了中介表格,查询效率不高。这不是一个很好的设计方式,应尽量避免多对多关联的设计。

原创粉丝点击