hibernate_day03_多对多关联映射
生活随笔
收集整理的這篇文章主要介紹了
hibernate_day03_多对多关联映射
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
hibernate_day03_MySQL數(shù)據(jù)庫-表與表之間的多對多關(guān)系-實例
hibernate_day03_一對多相關(guān)操作
Hibernate多對多關(guān)系的配置 :
(1)創(chuàng)建表 :
用戶表 【crm_sys_user.sql】:
CREATE TABLE `sys_user` (`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用戶id',`user_code` varchar(32) NOT NULL COMMENT '用戶賬號',`user_name` varchar(64) NOT NULL COMMENT '用戶名稱',`user_password` varchar(32) NOT NULL COMMENT '用戶密碼',`user_state` char(1) NOT NULL COMMENT '1:正常,0:暫停',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;角色表 【crm_sys_role.sql】:
CREATE TABLE `sys_role` (`role_id` bigint(32) NOT NULL AUTO_INCREMENT,`role_name` varchar(32) NOT NULL COMMENT '角色名稱',`role_memo` varchar(128) DEFAULT NULL COMMENT '備注',PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;中間表 【crm_sys_user_role.sql】:
CREATE TABLE `sys_user_role` (`role_id` bigint(32) NOT NULL COMMENT '角色id',`user_id` bigint(32) NOT NULL COMMENT '用戶id',PRIMARY KEY (`role_id`,`user_id`),KEY `FK_user_role_user_id` (`user_id`), /*創(chuàng)建兩個外鍵 分別指向 sys_user 、sys_role表的主鍵*/CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;(2)創(chuàng)建實體 :
User.java :
package com.itheima.hibernate.domain;import java.util.HashSet; import java.util.Set;/*** 用戶的實體*CREATE TABLE `sys_user` (`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用戶id',`user_code` varchar(32) NOT NULL COMMENT '用戶賬號',`user_name` varchar(64) NOT NULL COMMENT '用戶名稱',`user_password` varchar(32) NOT NULL COMMENT '用戶密碼',`user_state` char(1) NOT NULL COMMENT '1:正常,0:暫停',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;*/ public class User {private Long user_id;private String user_code;private String user_name;private String user_password;private String user_state;// 設(shè)置多對多關(guān)系:表示一個用戶選擇多個角色。// 放置的是角色的集合private Set<Role> roles = new HashSet<Role>();public Long getUser_id() {return user_id;}public void setUser_id(Long user_id) {this.user_id = user_id;}public String getUser_code() {return user_code;}public void setUser_code(String user_code) {this.user_code = user_code;}public String getUser_name() {return user_name;}public void setUser_name(String user_name) {this.user_name = user_name;}public String getUser_password() {return user_password;}public void setUser_password(String user_password) {this.user_password = user_password;}public String getUser_state() {return user_state;}public void setUser_state(String user_state) {this.user_state = user_state;}public Set<Role> getRoles() {return roles;}public void setRoles(Set<Role> roles) {this.roles = roles;}}?Role.java :
package com.itheima.hibernate.domain;import java.util.HashSet; import java.util.Set;/*** 角色的實體*CREATE TABLE `sys_role` (`role_id` bigint(32) NOT NULL AUTO_INCREMENT,`role_name` varchar(32) NOT NULL COMMENT '角色名稱',`role_memo` varchar(128) DEFAULT NULL COMMENT '備注',PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;*/ public class Role {private Long role_id;private String role_name;private String role_memo;// 一個角色被多個用戶選擇:// 放置的是用戶的集合private Set<User> users = new HashSet<User>();public Long getRole_id() {return role_id;}public void setRole_id(Long role_id) {this.role_id = role_id;}public String getRole_name() {return role_name;}public void setRole_name(String role_name) {this.role_name = role_name;}public String getRole_memo() {return role_memo;}public void setRole_memo(String role_memo) {this.role_memo = role_memo;}public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}(3)創(chuàng)建映射 :
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><!-- 連接數(shù)據(jù)庫的基本參數(shù) --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///hibernate_day03</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">lwx</property><!-- 配置Hibernate的方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 可選配置================ --><!-- 打印SQL --><property name="hibernate.show_sql">true</property><!-- 格式化SQL --><property name="hibernate.format_sql">true</property><!-- 自動創(chuàng)建表 create --><property name="hibernate.hbm2ddl.auto">create</property><!-- 配置C3P0連接池 --><property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><!--在連接池中可用的數(shù)據(jù)庫連接的最少數(shù)目 --><property name="c3p0.min_size">5</property><!--在連接池中所有數(shù)據(jù)庫連接的最大數(shù)目 --><property name="c3p0.max_size">20</property><!--設(shè)定數(shù)據(jù)庫連接的過期時間,以秒為單位,如果連接池中的某個數(shù)據(jù)庫連接處于空閑狀態(tài)的時間超過了timeout時間,就會從連接池中清除 --><property name="c3p0.timeout">120</property><!--每3000秒檢查所有連接池中的空閑連接 以秒為單位--><property name="c3p0.idle_test_period">3000</property><!-- 設(shè)置事務(wù)隔離級別 --><property name="hibernate.connection.isolation">4</property><!-- 配置當(dāng)前線程綁定的Session --><property name="hibernate.current_session_context_class">thread</property><!-- 引入映射 --><!-- <mapping resource="com/itheima/hibernate/domain/Customer.hbm.xml"/><mapping resource="com/itheima/hibernate/domain/LinkMan.hbm.xml"/> --><mapping resource="com/itheima/hibernate/domain/User.hbm.xml"/><mapping resource="com/itheima/hibernate/domain/Role.hbm.xml"/></session-factory> </hibernate-configuration>?log4j.properties【日志文件】 :
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c\:mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ### # error warn info debug trace log4j.rootLogger= info, stdout?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="com.itheima.hibernate.domain.User" table="sys_user"><!-- 建立OID與主鍵的映射 --><id name="user_id" column="user_id"><generator class="native"/></id><!-- 建立普通屬性與字段映射 --><property name="user_code" column="user_code"/><property name="user_name" column="user_name"/><property name="user_password" column="user_password"/><property name="user_state" column="user_state"/><!-- 建立與角色的多對多的映射關(guān)系 --><!-- set標(biāo)簽* name :對方的集合的屬性名稱。* table :多對多的關(guān)系需要使用中間表,放的是中間表的名稱。--><!-- cascade="save-update,delete" --><set name="roles" table="sys_user_role"><!-- key標(biāo)簽* column:當(dāng)前的對象對應(yīng)中間表的外鍵的名稱。中間表:兩個屬性[同時是主鍵\外鍵。]--><key column="user_id"/><!-- many-to-many標(biāo)簽:* class :對方的類的全路徑* column:對方的對象在中間表中的外鍵的名稱。--><many-to-many class="com.itheima.hibernate.domain.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"> <hibernate-mapping><class name="com.itheima.hibernate.domain.Role" table="sys_role"><!-- 建立OID與主鍵的映射 --><id name="role_id" column="role_id"><generator class="native"/></id><!-- 建立普通屬性與字段的映射 --><property name="role_name" column="role_name"/><property name="role_memo" column="role_memo"/><!-- 與用戶的多對多的映射關(guān)系 --><!-- set標(biāo)簽* name :對方的集合的屬性名稱。* table :多對多的關(guān)系需要使用中間表,放的是中間表的名稱。--><set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true"><!-- key標(biāo)簽:* column :當(dāng)前的對象對應(yīng)中間表的外鍵的名稱。--><key column="role_id"/><!-- many-to-many標(biāo)簽:* class :對方的類的全路徑* column :對方的對象在中間表中的外鍵的名稱。--><many-to-many class="com.itheima.hibernate.domain.User" column="user_id"/></set></class> </hibernate-mapping>(4)編寫測試類:
?HibernateDemo2.java :
package com.itheima.hibernate.demo2;import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.itheima.hibernate.domain.Role; import com.itheima.hibernate.domain.User; import com.itheima.hibernate.utils.HibernateUtils;/*** Hibernate的多對多的映射**/ public class HibernateDemo2 {@Test/**保存多條記錄:保存多個用戶和角色 */public void demo1(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 創(chuàng)建2個用戶User user1 = new User();user1.setUser_name("zhaohong");User user2 = new User();user2.setUser_name("libing");// 創(chuàng)建3個角色Role role1 = new Role();role1.setRole_name("yanfabu");Role role2 = new Role();role2.setRole_name("shichangbu");Role role3 = new Role();role3.setRole_name("gongguangbu");// 設(shè)置雙向的關(guān)聯(lián)關(guān)系:user1.getRoles().add(role1);user1.getRoles().add(role2);user2.getRoles().add(role2);user2.getRoles().add(role3);role1.getUsers().add(user1);role2.getUsers().add(user1);role2.getUsers().add(user2);role3.getUsers().add(user2);// 保存操作:多對多建立了雙向的關(guān)系,必須有一方放棄外鍵維護(hù)。// 要不然 報錯[ 主鍵重復(fù) ] 設(shè)置inverse="true"可不報錯// 一般是被動方放棄外鍵維護(hù)權(quán)。session.save(user1);session.save(user2);session.save(role1);session.save(role2);session.save(role3);tx.commit();}@Test/*** 多對多的操作:* * 只保存一邊是否可以?不可以,瞬時對象異常*/public void demo2(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 創(chuàng)建2個用戶User user1 = new User();user1.setUser_name("zhaohong");// 創(chuàng)建3個角色Role role1 = new Role();role1.setRole_name("yanfabu");// 設(shè)置雙向的關(guān)聯(lián)關(guān)系:user1.getRoles().add(role1);role1.getUsers().add(user1);// 只保存用戶:// session.save(user1);session.save(role1);tx.commit();}@Test/*** 多對多的級聯(lián)保存:* * 保存用戶級聯(lián)保存角色。在用戶的映射文件中配置。* * 在User.hbm.xml中的set上配置 cascade="save-update"*/public void demo3(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 創(chuàng)建2個用戶User user1 = new User();user1.setUser_name("zhaohong");// 創(chuàng)建3個角色Role role1 = new Role();role1.setRole_name("yanfabu");// 設(shè)置雙向的關(guān)聯(lián)關(guān)系:user1.getRoles().add(role1);role1.getUsers().add(user1);// 只保存用戶:session.save(user1);tx.commit();}/*** 多對多的級聯(lián)保存:* * 保存角色級聯(lián)保存用戶。在角色的映射文件中配置。* * 在Role.hbm.xml中的set上配置 cascade="save-update"*/@Testpublic void demo4(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 創(chuàng)建2個用戶User user1 = new User();user1.setUser_name("libing");// 創(chuàng)建3個角色Role role1 = new Role();role1.setRole_name("gonganbu");// 設(shè)置雙向的關(guān)聯(lián)關(guān)系:user1.getRoles().add(role1);role1.getUsers().add(user1);// 只保存用戶:session.save(role1);tx.commit();}/*** 多對多的級聯(lián)刪除:* * 刪除用戶級聯(lián)刪除角色* * 在User.hbm.xml中的set上配置 cascade="delete"*/@Testpublic void demo5(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();//級聯(lián)刪除,先查詢// 查詢1號用戶:User user = session.get(User.class, 1l);session.delete(user);tx.commit();}/*** 多對多的級聯(lián)刪除:* * 刪除角色級聯(lián)刪除用戶* * 在Role.hbm.xml中的set上配置 cascade="delete"*/@Testpublic void demo6(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 查詢2號角色:Role role = session.get(Role.class, 2l);session.delete(role);tx.commit();}@Test/*** 給用戶選擇角色*/public void demo7(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 給1號用戶多選2號角色// 查詢1號用戶User user = session.get(User.class, 1l);// 查詢2號角色Role role = session.get(Role.class, 2l);user.getRoles().add(role);tx.commit();}@Test/*** 給用戶改選角色*/public void demo8(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 給2號用戶將原有的2號角色改為3號角色// 查詢2號用戶User user = session.get(User.class, 2l);// 查詢2號角色Role role2 = session.get(Role.class, 2l);Role role3 = session.get(Role.class, 3l);user.getRoles().remove(role2);user.getRoles().add(role3);tx.commit();}@Test/*** 給用戶改選角色*/public void demo9(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 給2號用戶刪除1號角色// 查詢2號用戶User user = session.get(User.class, 2l);// 查詢2號角色Role role = session.get(Role.class, 1l);user.getRoles().remove(role);tx.commit();} }總結(jié)
以上是生活随笔為你收集整理的hibernate_day03_多对多关联映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 网络图片浏览器( Ima
- 下一篇: 匹配串 KMP算法