我参考了其文章,但是做了改进,尤其是hibernate教程里面很多地方比模糊。首先定义下面两个类 User 和Role,一个User可以有好多role,比如你既可以是老爹,也是儿子
package org.hibernate.tutorial.domain;
import java.util.Set;
public class User {
private int id;
private String name;
private Set roles;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
}
package org.hibernate.tutorial.domain;
public class Role {
private int id; //请注意,我这里一律采用id,而不是别人常用的user_id, 否则容易搞混了。</span>
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后定义hbm文件
<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="<span style="color:#ff0000;">t_user_role</span>">
<key column="<span style="color:#ff0000;">user_id</span>"/>
<many-to-many class="org.hibernate.tutorial.domain.Role" <span style="color:#ff0000;">column="role_id</span>" />
</set>
</class>
<class name="Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
请注意这里的几个关键属性
key - 这个key应该是第三个表,也就是t_user_role表里面的key,这个表应该包含下面这个字段
id, user_id, role_id.
其中id为主键, user_id和role_id为外键,分别指向t_user(id) , t_role(id)
column, 这个column应是指向了t_user_role中的role_id, 由这个role_id 指向t_role表的主键
很多人的文章里面这里的写user_id, 然后user表里面的主键名字也是user_id, 就让人搞不清楚到底这个user_id是哪个表里面的user_id
看程序
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Role role1 = new Role();
role1.setName("role1");
Role role2 = new Role();
role2.setName("role2");
User user = new User();
user.setName("user1");
Set set = new HashSet();
set.add(role1);
set.add(role2);
user.setRoles(set);
session.save(role1);
session.save(role2);
session.save(user);
session.getTransaction().commit();
附上表的定义
DROP TABLE IF EXISTS `t_role`;
CREATE TABLE `t_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t_user_role`;
CREATE TABLE `t_user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`role_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`role_id`),
KEY `FKa9c8iiy6ut0gnx491fqx4pxam` (`role_id`),
<span style="color:#ff0000;">CONSTRAINT `FKa9c8iiy6ut0gnx491fqx4pxam` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`),
CONSTRAINT `FKq5un6x7ecoef5w1n39cop66kl` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)</span>
) ENGINE=InnoDB DEFAULT CHARSET=utf8;