hibernate中多对多映射配置详细解析

    本工程以项目与开发人员构成多对多的关系来展开,构建多对多的关系,具体实现代码如下所示:


1.hibernate.cfg.xml文件



   
   
  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. “-//Hibernate/Hibernate Configuration DTD 3.0//EN”
  3. “http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd”>
  4. <hibernate-configuration>
  5. <!– 通常,一个session-factory节点代表一个数据库 –>
  6. <session-factory>
  7. <!– 1.数据库连接配置 –>
  8. <property name=“hibernate.connection.driver_class”>com.mysql.jdbc.Driver </property>
  9. <property name=“hibernate.connection.url”>jdbc:mysql:///hib-demo </property>
  10. <property name=“hibernate.connection.username”>root </property>
  11. <property name=“hibernate.connection.password”>123456 </property>
  12. <!–数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql –>
  13. <property name=“hibernate.dialect”>org.hibernate.dialect.MySQL5Dialect </property>
  14. <!– 2.其他相关配置 –>
  15. <!–2.1显示hibernate在运行的时候执行的sql语句 –>
  16. <property name=“hibernate.show_sql”>true </property>
  17. <!– 2.2格式化sql
  18. <property name=”hibernate.format_sql”>true</property>–>
  19. <!– 2.3自动建表 –>
  20. <property name=“hibernate.hbm2ddl.auto”>update </property>
  21. <!– 3.加载所有映射
  22. <mapping resource=”cn/itcast/a_hello/Employee.hbm.xml”/>–>
  23. </session-factory>
  24. </hibernate-configuration>

2.Developer


   
   
  1. package cn.itcast.c_many2many;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. //开发人员信息
  5. public class Developer {
  6. private Integer d_id; //开发人员编号
  7. private String d_name; //开发人员姓名
  8. //开发人员参与的多个项目
  9. private Set<Project> projects= new HashSet<Project>();
  10. public Integer getD_id() {
  11. return d_id;
  12. }
  13. public void setD_id(Integer d_id) {
  14. this.d_id = d_id;
  15. }
  16. public String getD_name() {
  17. return d_name;
  18. }
  19. public void setD_name(String d_name) {
  20. this.d_name = d_name;
  21. }
  22. public Set<Project> getProjects() {
  23. return projects;
  24. }
  25. public void setProjects(Set<Project> projects) {
  26. this.projects = projects;
  27. }
  28. }

3.Project


   
   
  1. package cn.itcast.c_many2many;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. public class Project {
  5. private Integer prj_id; //项目编号
  6. private String prj_name; //项目名称
  7. //项目下的多个员工
  8. private Set<Developer> developers= new HashSet<Developer>();
  9. public Integer getPrj_id() {
  10. return prj_id;
  11. }
  12. public void setPrj_id(Integer prj_id) {
  13. this.prj_id = prj_id;
  14. }
  15. public String getPrj_name() {
  16. return prj_name;
  17. }
  18. public void setPrj_name(String prj_name) {
  19. this.prj_name = prj_name;
  20. }
  21. public Set<Developer> getDevelopers() {
  22. return developers;
  23. }
  24. public void setDevelopers(Set<Developer> developers) {
  25. this.developers = developers;
  26. }
  27. }

4.Developer.hbm.xml



   
   
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!--
  6. This mapping demonstrates content-based discrimination for the
  7. table-per-hierarchy mapping strategy, using a formula
  8. discriminator.
  9. -->
  10. <!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
  11. <!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
  12. auto-import 默认为true,在写HQL的时候自动导入包名
  13. 如果指定为false,在写HQL的时候必须要写上类的全名-->
  14. <hibernate-mapping package="cn.itcast.c_many2many">
  15. <class name="Developer" table="t_developer">
  16. <id name="d_id">
  17. <generator class="native"> </generator>
  18. </id>
  19. <property name="d_name"> </property>
  20. <set name="projects" table="t_relation">
  21. <key column="did"> </key>
  22. <many-to-many column="prjId" class="Project"> </many-to-many>
  23. </set>
  24. </class>
  25. </hibernate-mapping>

5.Project.hbm.xml


   
   
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!--
  6. This mapping demonstrates content-based discrimination for the
  7. table-per-hierarchy mapping strategy, using a formula
  8. discriminator.
  9. -->
  10. <!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
  11. <!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
  12. auto-import 默认为true,在写HQL的时候自动导入包名
  13. 如果指定为false,在写HQL的时候必须要写上类的全名-->
  14. <hibernate-mapping package="cn.itcast.c_many2many">
  15. <class name="Project" table="t_project">
  16. <id name="prj_id">
  17. <generator class="native"> </generator>
  18. </id>
  19. <property name="prj_name"> </property>
  20. <!-- 多对多映射:
  21. 1.映射的集合属性:developers
  22. 2.集合属性:对应的中间表,t_relation
  23. 3.外键字段:prjid
  24. 4.外键字段:对应的中间表字段,did
  25. 5.集合属性元素的类型 -->
  26. <set name="developers" table="t_relation">
  27. <key column="prjId"> </key>
  28. <many-to-many column="did" class="Developer"> </many-to-many>
  29. </set>
  30. </class>
  31. </hibernate-mapping>

6.junit测试



   
   
  1. package cn.itcast.c_many2many;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.Transaction;
  4. import org.hibernate.cfg.Configuration;
  5. import org.hibernate.classic.Session;
  6. import org.junit.Test;
  7. public class App_save {
  8. private static SessionFactory sf;
  9. static{
  10. sf= new Configuration()
  11. .configure()
  12. .addClass(Project.class)
  13. .addClass(Developer.class) //测试的时候使用
  14. .buildSessionFactory();
  15. }
  16. //多对多数据的保存,只能通过一方维护另一方,不能重复维护!
  17. @Test
  18. public void Save() {
  19. Session session=sf.openSession();
  20. session.beginTransaction();
  21. //创建项目对象
  22. Project prj_ds= new Project();
  23. prj_ds.setPrj_name( "电商系统");
  24. Project prj_oa= new Project();
  25. prj_oa.setPrj_name( "OA系统");
  26. //创建员工对象
  27. Developer dev_cj= new Developer();
  28. dev_cj.setD_name( "刘德华");
  29. Developer dev_wc= new Developer();
  30. dev_wc.setD_name( "高园园");
  31. Developer dev_lz= new Developer();
  32. dev_lz.setD_name( "王明");
  33. //关系
  34. prj_ds.getDevelopers().add(dev_cj);
  35. prj_ds.getDevelopers().add(dev_wc); //电商系统 :刘德华,高园园
  36. prj_oa.getDevelopers().add(dev_cj);
  37. prj_oa.getDevelopers().add(dev_lz); //OA系统:刘德华,王明
  38. //保存
  39. session.save(dev_cj);
  40. session.save(dev_wc);
  41. session.save(dev_lz);
  42. session.save(prj_ds);
  43. session.save(prj_oa);
  44. session.getTransaction().commit();
  45. session.close();
  46. //得到九条结果
  47. /*Hibernate: insert into t_developer (d_name) values (?)
  48. Hibernate: insert into t_developer (d_name) values (?)
  49. Hibernate: insert into t_developer (d_name) values (?)
  50. Hibernate: insert into t_project (prj_name) values (?)
  51. Hibernate: insert into t_project (prj_name) values (?)
  52. Hibernate: insert into t_relation (prjId, did) values (?, ?)
  53. Hibernate: insert into t_relation (prjId, did) values (?, ?)
  54. Hibernate: insert into t_relation (prjId, did) values (?, ?)
  55. Hibernate: insert into t_relation (prjId, did) values (?, ?)
  56. */
  57. }
  58. @Test
  59. public void Save2() {
  60. Session session=sf.openSession();
  61. session.beginTransaction();
  62. session.getTransaction().commit();
  63. session.close();
  64. }
  65. }


            </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值