本文解决问题:Hibernate 中配置项目(Project) 员工(Employee)   双向多对多关联

方案一:直接配置双向多对多

方案二:配置第三个关联类(xml)   将多对多查分开来(形成两个单向多对一关联   完成双向多对多关系)

方案一:直接配置双向多对多

创建Employee持久化类

 public class Employee implements java.io.Serializable {

 // Fields

 private Integer empid;

 private String empname;

 private Set<Project> projects = new HashSet<Project>();

 ...其他内容省略

 }

创建Project持久化类

public class Project implements java.io.Serializable {
private Integer proid;
private String proname;
private Set<Employee> employees = new HashSet<Employee>();
...其他内容省略
}

分别创建两个小配置文件(hbm.xml文件)

创建Employee.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.happy.daymanymany.Employee" table="EMPLOYEE">
<id name="empid" type="java.lang.Integer">
<column name="EMPID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="empname" type="java.lang.String">
<column name="EMPNAME" length="" not-null="true" />
</property>
<set name="projects" inverse="true" table="PROEMP">
<key column="REMPID"/><!-- 表PROEMP的外键REMPID -->
<many-to-many class="cn.happy.daymanymany.Project" column="RPROID" />
</set>
</class>
</hibernate-mapping>

创建Project.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.happy.daymanymany.Project" table="PROJECT">
<id name="proid" type="java.lang.Integer">
<column name="PROID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="proname" type="java.lang.String">
<column name="PRONAME" length="" not-null="true" />
</property>
<set name="employees" table="PROEMP" cascade="save-update">
<key column="RPROID" />
<many-to-many class="cn.happy.daymanymany.Employee" column="REMPID" />
</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 name="foo"> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost::HR</property>
<property name="connection.username">happy</property>
<property name="connection.password">happy</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property> <mapping resource="cn/happy/daymanymany/Project.hbm.xml"/>
<mapping resource="cn/happy/daymanymany/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>

书写测试类

public static SessionFactory factory;
// 创建Session对象
public static Session session;
// 通过代码块赋值
static {
factory = new Configuration().configure().buildSessionFactory();
session = factory.openSession();
}
@Test
public void addTest(){
Transaction tran = null;
try {
tran = session.beginTransaction();
//创建EMP对象
Employee emp=new Employee();
emp.setEmpname("李小龙");
//创建Pro对象
Project pro=new Project();
pro.setProname("海淀花园");
//指定工程需要的员工
pro.getEmployees().add(emp);
//指定员工所属的工程
emp.getProjects().add(pro);
session.save(pro);
// 事务提交
tran.commit();
System.out.println("成功");
} catch (Exception e) {
e.printStackTrace();
if (tran != null) {
tran.rollback();
}
throw new RuntimeException("错误");
} finally {
// 关闭session
session.close();
}
}
注意:双向多对多,还可以拆成两个多对一 <many-to-one name="emp" class="Employee">
          <column name="empid"></column>
</many-to-one>
<many-to-one name="pro" class="Project">
<column name="proid"></column>
</many-to-one> 方案二:配置第三个关联类(xml)   将多对多查分开来(形成两个单向多对一关联   完成双向多对多关系) (完成与上方同样的功能)分别创建 Employee类、Project类、ProEmp类 ...hbm.xml

创建Employee持久化类

public class Employee implements java.io.Serializable {
private Integer empid;
private String empname;
private Set<ProEmp> projects = new HashSet<ProEmp>();
...其他内容省略 getter() and setter()
}

创建Project持久化类

public class Project implements java.io.Serializable {
private Integer proid;
private String proname;
private Set<ProEmp> employees = new HashSet<ProEmp>();
...其他内容省略
}

创建ProEmp持久化类

public class ProEmp implements Serializable {
private Integer id;
private Project pro;
private Employee emp;

现在来看  拆分后就成了    Employee和Project  分别于ProEmp一对多单向关联的关系了    所以    Employee.hbm.xml和Project.hbm.xml就不必再去关注了。

直接就是ProEmp.hbm.xml 的配置了

创建ProEmp.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.daymanymany">
<class name="ProEmp" table="PROEMP">
<id name="id" type="java.lang.Integer">
<column name="ID"/> <!-- PROEMP表id字段 -->
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<!-- 配置PROEMP与Employee关联
      name:“emp” 指的是PROEMP 类中的相关字段
          “empid”指的是Employee 类主键列
     -->
<many-to-one name="emp" class="Employee">
<column name="empid"></column>
</many-to-one>
    <!-- 配置PROEMP与Employee关联
        name:“emp” 指的是PROEMP 类中的相关字段
            “empid”   指的是Employee 类主键列
     -->
  <many-to-one name="pro" class="Project">
   <column name="proid"></column>
  </many-to-one> </class>
  </hibernate-mapping>
测试方案二:
@Test
public void many_many_test3(){
Session session = HibernateUtil.getSession();
session.beginTransaction(); Employee emp1 = new Employee();
emp1.setEname("王哲2"); //Project project1 = new Project("1号项目");
ProEmp p = (ProEmp)session.load(ProEmp.class,new Integer()); ProEmp proemp = new ProEmp();
proemp.setEmp(emp1);
proemp.setPro(project1); session.save(emp1);
session.save(project1);
session.save(proemp); session.getTransaction().commit();
System.out.println("ok");
}




最新文章

  1. Redis Cluster搭建方法简介22211111
  2. JQuery 菜鸟笔记(一)
  3. How to inspect who is caller of func and who is the class of instance
  4. sqlserver中创建包含事务的存储过程
  5. 八大常见内排序java实现
  6. 2016.3.22考试(HNOI难度)
  7. webrtc 的回声抵消(aec、aecm)算法简介(转)
  8. VSX规划Package文件
  9. OWASP 2013年十大Web应用安全漏洞
  10. LINQ 操作符(二)
  11. iOS毛玻璃擦除效果
  12. Mybatis的基本使用
  13. 章节十、7-Xpath---Xpath中绝对路径相对路径的区别
  14. Ehcache 3.7文档—基础篇—GettingStarted
  15. CustomScrollView
  16. bootstrap全局样式二
  17. c#实战开发:以太坊钱包对接私链 (二)
  18. 《R数据挖掘入门》彩色插图(第8章)
  19. socket 映射服务器--(可处理多客户端连接(fork),显示退出信息)
  20. Linux Packages Search

热门文章

  1. MessageFormat理解,MessageFormat.format(Object obj)方法
  2. Leetcode 79.单词搜索
  3. 【Google Chrome】Google Chrome快捷键大全
  4. Hihocoder 1337 (splay)
  5. code wars quiz: toInteger
  6. [kuangbin带你飞]专题四 最短路练习 G MPI Maelstrom
  7. ubuntu无法update
  8. 阿里云nginx创建多站点
  9. 怎样在Linux下使用Markdown进行文档工作
  10. ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值