Hibernate many-to-many映射xml配置方法

我参考了其文章,但是做了改进,尤其是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;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值