Hibernate 配置双向多对多关联
2024-08-30 01:11:04
本文解决问题: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");
}
最新文章
- Redis Cluster搭建方法简介22211111
- JQuery 菜鸟笔记(一)
- How to inspect who is caller of func and who is the class of instance
- sqlserver中创建包含事务的存储过程
- 八大常见内排序java实现
- 2016.3.22考试(HNOI难度)
- webrtc 的回声抵消(aec、aecm)算法简介(转)
- VSX规划Package文件
- OWASP 2013年十大Web应用安全漏洞
- LINQ 操作符(二)
- iOS毛玻璃擦除效果
- Mybatis的基本使用
- 章节十、7-Xpath---Xpath中绝对路径相对路径的区别
- Ehcache 3.7文档—基础篇—GettingStarted
- CustomScrollView
- bootstrap全局样式二
- c#实战开发:以太坊钱包对接私链 (二)
- 《R数据挖掘入门》彩色插图(第8章)
- socket 映射服务器--(可处理多客户端连接(fork),显示退出信息)
- Linux Packages Search
热门文章
- MessageFormat理解,MessageFormat.format(Object obj)方法
- Leetcode 79.单词搜索
- 【Google Chrome】Google Chrome快捷键大全
- Hihocoder 1337 (splay)
- code wars quiz: toInteger
- [kuangbin带你飞]专题四 最短路练习 G MPI Maelstrom
- ubuntu无法update
- 阿里云nginx创建多站点
- 怎样在Linux下使用Markdown进行文档工作
- ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值