Hibernate:多对多级联操作

学习多表映射配置要遵循的步骤

第一步:确立两张表之间的关系

第二步:在数据库中实现两张表之间的关系建立,在数据库中实现多对多要靠中间表,中间表只能出现两表的主键

第三步:在实体类中描述出两个实体之间的关系,

建立多对多实体类,两个实体类分别提供对方实体类set集合的引用

建立一对多实体类,当中间表有其他字段时以一对多方式建立实体类

第四步:在映射配置文件中建立两个实体和两张表之间的关系

 

User.java

private Integer userId;
private String userName;
private Set<Role> role = new HashSet<>(0);

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="org.haiwen.entity.User" table="user" >
		<id name="userId" column="user_id" >
			<generator class="native" />
		</id>
		<property name="userName" type="java.lang.String" column="user_name" />
		<!-- 多对多关系映射
		标签:set
              作用:用于映射set集合属性
              属性:name,指定集合的名称
                   table,指定中间表的名称
            标签:key
               作用:用于映射外键关系
               属性:column,指定当前实体类在中间表的外键字段的名称
               
            标签:many-to-maney
                作用:用于建立多对多的映射配置
                属性:class,对方实体类的名称
                    column,对方在中间表的外键字段名称 -->
		<set name="role" table="user_role" inverse="true">
			<key column="user_id"></key>
			<many-to-many class="org.haiwen.entity.Role" column="role_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

Role.java

private Integer roleId;
private String roleName;
private Set<User> user = new HashSet<>(0);

Role.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="org.haiwen.entity.Role" table="role">
		<id name="roleId" column="role_id">
			<generator class="native" />
		</id>
		<property name="roleName" type="java.lang.String" column="role_name" />
		<set name="user" table="user_role">
			<key column="role_id"></key>
			<many-to-many class="org.haiwen.entity.User" column="user_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>

		<property name="show_sql">true</property>
		<property name="format_sql">true</property>

		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.hbm2dll.auto">update</property>
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<property name="hibernate.current_session_context_class">thread</property>

		<mapping resource="org/haiwen/entity/User.hbm.xml" />
		<mapping resource="org/haiwen/entity/Role.hbm.xml" />
	</session-factory>
</hibernate-configuration>

HibernateUtils.java

public class HibernateUtils {
	static Configuration cfg;
	static SessionFactory factory = null;
	static {
		try {
			cfg = new Configuration();
			cfg.configure();
			factory = cfg.buildSessionFactory();
		} catch (ExceptionInInitializerError e) {
			throw new ExceptionInInitializerError("初始化SessionFactory失败,请检查配置文件");
		}
	}

	public static Session getCurrentSession() {
		return factory.getCurrentSession();// 每次使用该方法从当前线程上获取一个session,只有配置了session和线程绑定之后才能使用此方法,否则返回null
	}
}

级联保存

/**
 * 需求:
 *	创建2个用户3个角色
 *	让1号用户具备1号和2号角色
 *	让2号用户具备2号和3号角色
 */
public void save() {
	User user1 = new User();
	user1.setUserName("用户1");
	User user2 = new User();
	user2.setUserName("用户2");
	Role role1 = new Role();
	role1.setRoleName("角色1");
	Role role2 = new Role();
	role2.setRoleName("角色2");
	Role role3 = new Role();
	role3.setRoleName("角色3");

	user1.getRole().add(role1);
	user1.getRole().add(role2);
	user2.getRole().add(role2);
	user2.getRole().add(role3);

	role1.getUser().add(user1);
	role2.getUser().add(user1);
	role2.getUser().add(user2);
	role3.getUser().add(user2);

	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	session.save(user1);
	session.save(user2);
	session.save(role1);
	session.save(role2);
	session.save(role3);
	session.getTransaction().commit();
}

级联删除

/**
 * 实际开发中:多对多的双向级联删除是禁止使用的
 */
public void delete() {
	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	User user = (User) session.get(User.class, 1);
	session.delete(user);
	session.getTransaction().commit();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值