Hibernate-多对多关系映射
来源:互联网 发布:python教程pdf下载 编辑:程序博客网 时间:2024/05/21 03:54
多对多关系映射:
多对多和之前的一对多和多对一的区别就是需要再维护一个表,去存储两表的id,然后将两边进行关联起来
我们就以Developer和Project多对多的关系就行说明
首先建立实体类Developer.java,并建立getter和setter方法,属性如下,
private int d_id;private String d_name;// 开发人员,参数的多个项目private Set<Project> projects = new HashSet<Project>();
private int prj_id;private String prj_name;// 项目下的多个员工private Set<Developer> developers = new HashSet<Developer>();
然后对应写出主配置文件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> <!-- jdbc驱动类 --> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- jdbc的url --> <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property> <!-- jdbc的用户名 --> <property name="hibernate.connection.username">evan</property> <!-- jdbc的密码 --> <property name="hibernate.connection.password">123</property><!-- 打印映射信息 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">create</property> <!-- 方言 --> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- 配置c3p0连接池 --> <!-- 最大连接数 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 最小连接数 --> <property name="hibernate.c3p0.min_size">1</property> <!-- 获取连接超时时间,若超过这个时间会抛出异常,单位:毫秒 --> <property name="hibernate.c3p0.timeout">5000</property> <!-- 创建PreparedStatement对象的最大数量 --> <property name="hibernate.c3p0.max_statements">100</property> <!-- 每个指定时间检查连接池中的空闲连接,时间单位:秒 --> <property name="hibernate.c3p0.idle_test_period">150</property> <!-- 当连接池使用完毕,c3p0再和数据库建立n个连接放置到连接池中 --> <property name="hibernate.c3p0.acquire_increment">2</property> <!-- 每次都验证连接是否可用 --> <property name="hibernate.c3p0.validate">true</property> <!-- 将session与当前线程绑定 --> <property name="current_session_context_class">thread</property> <!-- 映射路径 --> <!-- <mapping resource="cn/qblank/hibernate/entity/stu.hbm.xml"/> --> <!-- <mapping resource="cn/qblank/hibernate/entity/employee.hbm.xml"/> <mapping resource="cn/qblank/hibernate/entity/dept.hbm.xml"/> --> </session-factory></hibernate-configuration>
然后再对应地写出实体类的映射文件
project.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 package="cn.qblank.hibernate.entity"><class name="Project" table="t_project"><id name="prj_id" type="integer"><generator class="native"></generator></id><property name="prj_name" column="prj_name" type="string"></property><!-- 多对多映射:1. 映射的集合属性: “developers”2. 集合属性,对应的中间表: “t_relation”3. 外键字段: prjId4. 外键字段,对应的中间表字段: did5. 集合属性元素的类型 --><set name="developers" table="t_realation" cascade="all"><key column="prjId"></key><many-to-many column="did" class="Developer"></many-to-many></set></class></hibernate-mapping>
developer.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 package="cn.qblank.hibernate.entity"><class name="Developer" table="t_developer"><id name="d_id" type="integer"><generator class="native"></generator></id><property name="d_name" column="d_name" type="string"></property><!-- 多对多映射配置: 员工方name 指定映射的集合属性table 集合属性对应的中间表key 指定中间表的外键字段(引用当前表t_developer主键的外键字段)many-to-manycolumn 指定外键字段对应的项目字段class 集合元素的类型 --><set name="projects" table="t_realation"><key column="did"></key><many-to-many column="prjId" class="Project"></many-to-many></set></class></hibernate-mapping>
接下来,我们就来测试一下
package cn.qblank.hibernate.test;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import cn.qblank.hibernate.entity.Developer;import cn.qblank.hibernate.entity.Project;public class ManyToMany {private static SessionFactory factory;private static Transaction trans = null;static {factory = new Configuration().configure().addClass(Project.class) .addClass(Developer.class) // 测试时候使用.buildSessionFactory();}public static void main(String[] args) {save();}// 1. 多对多,保存 【只能通过一方维护另外一方,不能重复维护!】public static void save() {Session session = factory.openSession();trans = session.beginTransaction();/* * 模拟数据: 京东商城(老王,evan)租车系统(老丁,evan) */// 创建项目对象Project prj_jd = new Project();Project prj_zc = new Project();prj_jd.setPrj_name("京东商城");prj_zc.setPrj_name("租车系统");// 创建员工对象Developer dev_evan = new Developer();Developer dev_wang = new Developer();Developer dev_ding = new Developer();dev_evan.setD_name("evan");dev_wang.setD_name("老王");dev_ding.setD_name("老丁");// 关系 【项目方】//京东商城prj_jd.getDevelopers().add(dev_evan);prj_jd.getDevelopers().add(dev_wang);//租车系统prj_zc.getDevelopers().add(dev_evan);prj_zc.getDevelopers().add(dev_ding);try {// 保存//插入项目session.save(prj_jd);session.save(prj_zc); // 必须要设置级联保存 trans.commit();} catch (HibernateException e) {e.printStackTrace();trans.rollback();}finally{session.close();}}}
运行结果如下:
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into t_project (prj_name, prj_id) values (?, ?)
Hibernate: insert into t_developer (d_name, d_id) values (?, ?)
Hibernate: insert into t_developer (d_name, d_id) values (?, ?)
Hibernate: insert into t_project (prj_name, prj_id) values (?, ?)
Hibernate: insert into t_developer (d_name, d_id) values (?, ?)
Hibernate: insert into t_realation (prjId, did) values (?, ?)
Hibernate: insert into t_realation (prjId, did) values (?, ?)
Hibernate: insert into t_realation (prjId, did) values (?, ?)
Hibernate: insert into t_realation (prjId, did) values (?, ?)
数据库的表的结果如下:
- Hibernate关系映射之多对多关系
- Hibernate对象关系映射-- 多对多关联关系映射
- Hibernate映射关系之多对多关系映射
- Hibernate对象关系映射详解之一对多关系映射
- Hibernate的关系映射多对多
- hibernate之映射关系多对多
- hibernate 映射关系 多对多
- Hibernate多对多关系映射
- Hibernate映射关系-多对多
- Hibernate 多对多关系映射详解
- Java- Hibernate 多对多关系映射
- Hibernate 映射多对多关联关系
- hibernate多对多关系映射
- hibernate中多对多关系映射
- hibernate多对多映射关系
- Hibernate 映射多对多关联关系
- Hibernate关联关系映射---多对多
- Hibernate映射多对多关联关系
- 命令行操作jar可执行文件进行excel转json操作并通过命令行传递文件路径
- 关于Ogre的编译
- 第六篇:Runnable和Thread实现多线程的区别(含代码)
- LDO稳压器工作原理
- CURL
- Hibernate-多对多关系映射
- Android Webview js 简单应用
- Android 连续点击返回键退出程序
- 汇编逻辑运算指令笔记
- 2.4 滚动条(Scroll Bar)使用实例
- java 生成静态页面——Freemarker实例教程
- Java 课下练习题 T2
- c#基础 接口
- r-cnn系列代码编译及解读(4)