hibernate多对一的操作解析
在hibernate的关联操作中有很多关系,其中多对一关系是最常见的。我们看这两个表。
这里有部门表和员工表。
那么我们可以这么说一个部门可以有多个员工。这就是1对多的关系。这是我们站在部门表的角度上看的。
那么我们也可以说多个员工是一个部门的,这就是多对一的关系。这就是我们站在员工表的角度上说的。
下面我做一个多对一的例子,实现两表的增加和查询操作。
1. 部门对象映射类
package com.fish.testdao;
public class Department {
private Integer id;//部门编号
private String name;//部门名称
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 员工对象映射对象类
package com.fish.testdao;
public class Employee {
private Integer id;//员工编号
private String name;//员工姓名
private Department department;//部门类(有这个我们就可以找到部门表的信息)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
接着我们写一个部门的映射xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.testdao.Department" >
<id name="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
然后一写一个员工的映射xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.testdao.Employee" >
<id name="id" column="id"type="integer">
<generator class="increment"></generator>
</id>
<property name="name" ></property>
<many-to-one name="department" ></many-to-one>
</class>
</hibernate-mapping>
*注<many-to-onename="department" ></many-to-one>这句话就说明了我们是站在员工表的角度操作部门表的。首先name是前面映射类的属性,后面如果不加property-ref="部门表中的字段" 则说明该表默认找部门的表主键为员工表的外键。这样我们可以在数据库生成的表,department就是在员工表的外键,且字段名是department
所以我一直的理解就是多对一就是通过外键来实现的。
然后我们写一个配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="show_sql" >false</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/fish/testdao/Employee.hbm.xml"/>
<mapping resource="com/fish/testdao/Department.hbm.xml"/>
</session-factory>
</hibernate-configuration>
我们写一个测试类
package com.fish.domain;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.fish.testdao.Department;
import com.fish.testdao.Employee;
public class Test {
//写一个得到session的模板
public staticSession getMySession() {
Configurationconfiguration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactoryfactory = configuration.buildSessionFactory();
Sessionsession = factory.openSession();
returnsession;
}
//对两个表数据的添加
public staticvoid add() {
Sessionsession = getMySession();
Departmentdepartment = new Department();
department.setName("财务部");
Employeeemployee = new Employee();
employee.setName("yaku");
employee.setDepartment(department);
Transactiontransaction = session.beginTransaction();
transaction.begin();
session.save(department);
session.save(employee);
transaction.commit();
session.close();
}
//通过查员工表知道他是隶属那个部门的
public staticvoid query() {
String hql ="from Employee";
Sessionsession = getMySession();
Query query =session.createQuery(hql);
List<Employee>list = query.list();
for (Employeei : list) {
System.out.println(i.getName()+"归属"+i.getDepartment().getName());
//结果是: yaku归属财务部
}
}
public staticvoid main(String[] args) throws Exception {
add();
query();
}
}
hibernate多对一的操作解析的更多相关文章
- java框架之Hibernate(3)-一对多和多对多关系操作
一对多 例:一个班级可以有多个学生,而一个学生只能属于一个班级. 模型 package com.zze.bean; import java.util.HashSet; import java.util ...
- Hibernate多对多操作
---------------------siwuxie095 Hibernate 多对多操作 以用户和角色为例 (一)多对多映射配置 第一步:创建两个实体类,用户和角色 第二步:让两个实体类之间互相 ...
- Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate多对一单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate 多对多
HibernateHibernate多对多关联映射通常别拆分成两个多对一关联映射1. 下面的HostBean.UserBean.UserHostBean,UserHostBean是两个表之间的关联表, ...
- Hibernate多对一ManytoOne
------------------------Hibernate多对一ManytoOne 要点: ManytoOne配置在多端 可以配置级联操作 @ManyToOne(cascade=Cascade ...
- Hibernate 多对一关联查询
版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5598269.html 一.单向多对一和双向多对一的区别 如果只 ...
随机推荐
- SCOI2014省选总结
这一次省选,主要是抱着玩的心态去的,如同高二的那些大神高一的心态一样,只记得在省选之前我们一直在说,这一次我们的目标,就是不爆0,最后也如愿以偿的实现了. 首先,请允许我吐槽一下day1.....da ...
- jquery 弹出框 showDialog.js具体用法
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABWwAAAImCAIAAABID1T7AAAgAElEQVR4nO3d329c52Hgff1HvPCNLw
- functools:管理函数工具(部分)
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #functools:管理函数工具 #作用:处理其他函数的函数 #版 ...
- IOS UIImage 模糊
#import <UIKit/UIKit.h> #import <Accelerate/Accelerate.h> #import <QuartzCore/QuartzC ...
- 通过winForm控制webForm的上传控件file的值
文件上传是日常开发中经常遇到的,文件上传用的最多的当然是上传控件file了,一个form表单,其中有一点就是form表单的enctype属性设置为multipart/form-data,呵呵,这个在所 ...
- php 依据字符串生成相应数组方法
php 依据字符串生成相应数组方法 比如: <?php $config = array( 'project|page|index' => 'content', 'project|page| ...
- volley三种基本请求图片的方式与Lru的基本使用:正常的加载+含有Lru缓存的加载+Volley控件networkImageview的使用
首先做出全局的请求队列 package com.qg.lizhanqi.myvolleydemo; import android.app.Application; import com.android ...
- Cocoapods依赖管理
对于iOS App的开发,几乎都采用了Cocoapods来管理第三方库,那么对于开发人员来说,这是必备技能,必须要掌握如何使用.这篇文章就是介绍如何安装和使用CocoaPods的. 简单来说,就是专门 ...
- 简单的拖动手势控制侧拉view显示
通过 UIPanGestureRecognizer 手势来控制侧拉view的显示 在QHLViewController.m文件中,先添加一些宏定义和参数等等. #define QHLAnimatin ...
- java一点东西(3)
运算符的优先级:()优先级最高 ! ++ -- 单目运算符 * / % + - > < <= >= == != && || 赋值符号 面向对象设计步骤:1.发现 ...