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类别如下:
package onlyfun.caterpillar;再来设计Server类别如下:
import java.util.Set;
public class User {
private Integer id;
private String name;
private Set 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 getServers() {
return servers;
}
public void setServers(Set servers) {
this.servers = servers;
}
}
package onlyfun.caterpillar;在映射文件上,使用<many-to-many>标签来完成映像关系:
import java.util.Set;
public class Server {
private Integer id;
private String address;
private Set 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 getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
}
<?xml version="1.0" encoding="utf-8"?>注意到cascade是设定为save-update,因为在多对多的关系中,很少因为删除其中之一,而所关联的实体都要一并删除的,所以设定save-update,表示在save或update时,一并对关联的对象进行对应的save或update。
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.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="onlyfun.caterpillar.Server"
column="server_id"/>
</set>
</class>
</hibernate-mapping>
<?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="onlyfun.caterpillar.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="onlyfun.caterpillar.User"
column="user_id"/>
</set>
</class>
</hibernate-mapping>
Server server1 = new Server(); server1.setAddress("PC-219"); server1.setUsers(new HashSet()); Server server2 = new Server(); server2.setAddress("PC-220"); server2.setUsers(new HashSet()); Server server3 = new Server(); server3.setAddress("PC-221"); server3.setUsers(new HashSet()); User user1 = new User(); user1.setName("caterpillar"); user1.setServers(new HashSet()); User user2 = new User(); user2.setName("momor"); user2.setServers(new HashSet()); // 多对多,互相参考 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();执行后数据库的内容如下:
mysql> select * from user; +----+--------------+ | id | name | +----+--------------+ | 1 | caterpillar | | 2 | momor | +----+--------------+ 2 rows in set (0.00 sec) mysql> select * from user_serv +----------+-------------+ | user_id | server_id | +----------+-------------+ | 1 | 1 | | 1 | 2 | | 1 | 3 | | 2 | 1 | | 2 | 2 | +----------+-------------+ 5 rows in set (0.00 sec) mysql> select * from server; +----+-----------+ | id | address | +----+-----------+ | 1 | PC-219 | | 2 | PC-221 | | 3 | PC-220 | +----+-----------+ 3 rows in set (0.00 sec) |