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(); } }