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

 要实现多对多的对应,一般可以借由一个中间表来完成。也就是借由一对多,多对一来完成。

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. }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hibernate是一个Java持久化框架,它能够将Java对象映射到数据库中的表格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多和多对多关系,我们可以通过以下方式进行映射。 一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间表来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间表中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表的表名和两个外键的列名。 总结:通过Hibernate的注解方式,可以方便地实现一对一、一对多和多对多关系映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成表结构的功能,可以根据Java实体类来动态创建或更新对应的数据库表格,从而提高系统的可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值