要實現多對多的對應,一般可以借由一個中間表來完成。也就是借由一對多,多對一來完成。
ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程
DDL:
- CREATE TABLE user (
- id INT(11) NOT NULL auto_increment PRIMARY KEY,
- name VARCHAR(100) NOT NULL default ''
- );
- CREATE TABLE user_server (
- user_id INT(11),
- server_id INT(11)
- );
- CREATE TABLE server (
- id INT(11) NOT NULL auto_increment PRIMARY KEY,
- address VARCHAR(100) NOT NULL default ''
- );
User.java
- package com.hb3.pack_19.model;
- import java.util.Set;
- public class User {
- private Integer id;
- private String name;
- private Set<Server> servers;
- public User() {
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Set<Server> getServers() {
- return servers;
- }
- public void setServers(Set<Server> servers) {
- this.servers = servers;
- }
- }
Server.java
- package com.hb3.pack_19.model;
- import java.util.Set;
- public class Server {
- private Integer id;
- private String address;
- private Set<User> users;
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
- }
Server.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">
- <hibernate-mapping>
- <class name="com.hb3.pack_19.model.Server" table="server">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <property name="address" type="java.lang.String"/>
- <set name="users"
- table="user_server"
- inverse="true"
- cascade="save-update">
- <key column="server_id"/>
- <many-to-many class="com.hb3.pack_19.model.User"
- column="user_id"/>
- </set>
- </class>
- </hibernate-mapping>
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">
- <hibernate-mapping>
- <class name="com.hb3.pack_19.model.User" table="user">
- <id name="id" column="id" type="java.lang.Integer">
- <generator class="native"/>
- </id>
- <property name="name" column="name" type="java.lang.String"/>
- <set name="servers"
- table="user_server"
- cascade="save-update">
- <key column="user_id"/>
- <many-to-many class="com.hb3.pack_19.model.Server"
- column="server_id"/>
- </set>
- </class>
- </hibernate-mapping>
測試代碼:
- package com.hb3.pack_19;
- import java.io.IOException;
- import java.sql.SQLException;
- import java.util.HashSet;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import com.hb3.pack_19.model.Server;
- import com.hb3.pack_19.model.User;
- public class BusinessService {
- public static void main(String[] args) throws IOException, SQLException {
- Configuration config = new Configuration().configure();
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.openSession();
- Server server1 = new Server();
- server1.setAddress("PC-219");
- server1.setUsers(new HashSet<User>());
- Server server2 = new Server();
- server2.setAddress("PC-220");
- server2.setUsers(new HashSet<User>());
- Server server3 = new Server();
- server3.setAddress("PC-221");
- server3.setUsers(new HashSet<User>());
- User user1 = new User();
- user1.setName("shenbin");
- user1.setServers(new HashSet<Server>());
- User user2 = new User();
- user2.setName("chenyan");
- user2.setServers(new HashSet<Server>());
- 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);
- Transaction tx= session.beginTransaction();
- session.save(user1);
- session.save(user2);
- tx.commit();
- session.close();
- sessionFactory.close();
- }
- }
但是,多對多映射由于使用了中介表格,查詢效率不高。這不是一個很好的設計方式,應盡量避免多對多關聯的設計。
ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程