【Hibernate】多对多关系的表达

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">

<!-- package:填写一个包名,需要书写完整类名的属性,可以写简答类名 -->
<hibernate-mapping package="com.ysong.domain">
    <!-- class元素:配置实体与表的关系 name:实体完整类名 table:数据库表名 -->
    <class name="User" table="sys_user">
        <id name="user_id">
            <generator class="native"></generator>
        </id>
        <property name="user_code" />
        <property name="user_name" />
        <property name="user_password" />
        <property name="user_state" />
        
        <!--多对多关系表达 :多对多在set中要多一个table roles为User实体中Set集合的对象名 -->
    <set name="roles" table="sys_user_role" >
        <!--主键:user_id  -->
        <key column="user_id"></key>
        <!--外键:role_id-->
        <many-to-many class="Role" column="role_id" />
    </set>
    </class>

</hibernate-mapping>

 

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">

<!-- package:填写一个包名,需要书写完整类名的属性,可以写简答类名 -->
<hibernate-mapping package="com.ysong.domain">
    <!-- class元素:配置实体与表的关系 name:实体完整类名 table:数据库表名 -->
    <class name="Role" table="sys_role">
        <id name="role_id">
            <generator class="native"></generator>
        </id>

        <property name="role_name" />
        <property name="role_memo" />
        
        <!-- inverse="true" tru为放弃维护外键关系 
            结论:将来在开发中,如果遇到多对多关系,有一方一定要放弃维护关系,谁放弃维护,要看业务方向
            例如:需要为员工指定所属角色,那么 业务方向就是由员工维护角色,角色放弃维护。
        -->
        <set name="users"  table="sys_user_role" inverse="true">
            <key column="role_id"></key>
            <many-to-many class="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>
        <!-- 必选属性 (5个) -->
        <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库url -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <!-- 数据库用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 数据库密码 -->
        <property name="hibernate.connection.password"></property>
        <!-- 数据库方言 : 不同的数据库中,sql语法略有区别 ,指定方言可以让hibernate框架在生成sql语句时,根据 数据库方言生成。 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 可选属性(3个) -->
        <!-- 将hibernate生成的sql语句打印到控制台 -->
        <property name="hibernate.show_sql">true</property>
        
        <!-- 将hibernate生成的sql语句格式化 -->
        <property name="hibernate.format_sql">true</property>

        <!--## auto schema export 自动导出表,构建表 #hibernate.hbm2ddl.auto create(每次框架运行完之后都会创建新表,之前的表会被覆盖。) 
            #hibernate.hbm2ddl.auto create-drop (每次框架运行完之后都会将所有表删除) #hibernate.hbm2ddl.auto 
            update (如果有表变动,会自动更新有改变的表) #hibernate.hbm2ddl.auto validate(校验 )不自动生成表 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8 0001 
            1 读未提交 0010 2 读已提交 0100 4 可重复读 1000 8 串行化 -->
        <property name="hibernate.connection.isolation">4</property>
        
        <!--如果用的getCurrentSession,这里必须要配置 -->
        <property name="hibernate.current_session_context_class">thread</property>
        
        <!-- 引入orm元数据 -->
       
        <mapping resource="com/ysong/domain/Role.hbm.xml" />
        <mapping resource="com/ysong/domain/User.hbm.xml" />

    </session-factory>
</hibernate-configuration>

Demo.java

package com.ysong.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.ysong.domain.Role;
import com.ysong.domain.User;
import com.ysong.utils.HibernateUtils;

/*
 * 表达多对多关系
 * 
 * 多对多关系维护中,通过中间表来维护两表的关系,中间表有两列,都为主键。如果不加inverse属性,默认双方都要维护关系,
 * 会导致主键重复,所以会报错。
 */
public class Many2ManyDemo {
    @Test
    public void fun1() {
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        try {
            // 操作
            // 1.创建两个User
            User user1 = new User();
            user1.setUser_name("杨先生");
            User user2 = new User();
            user2.setUser_name("李女士");
            // 2.创建两个User
            Role role1 = new Role();
            role1.setRole_name("程序员");
            Role role2 = new Role();
            role2.setRole_name("老师");
            // 3.用户表达关系
            user1.getRoles().add(role1);
            user1.getRoles().add(role2);

            user2.getRoles().add(role1);
            user2.getRoles().add(role2);

            // 4.角色表达关系
            role1.getUsers().add(user1);
            role1.getUsers().add(user2);

            role2.getUsers().add(user1);
            role2.getUsers().add(user2);

            // 5.调用Save方法一次保存
            session.save(user1);
            session.save(user2);
            session.save(role1);
            session.save(role2);
        } catch (Exception e) {
            tx.rollback();
        }

        tx.commit();
        session.close();
    }

}

 

转载于:https://www.cnblogs.com/y-song/p/10932915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值