hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有
今天来到混元气功 这货大概的意思就是你中有我 我中有你 ps 这里就要说到维护关系 ps写这个用了我一下午.......也是刚刚好复习到这里 顺便就写写
注意:一般都在多方维护关系,至于是用单向还是用多向要看业务需求。
单向 n-1 关联只需从 n 的一端可以访问 1 的一端。
建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以员工和部门为例子来演示。以前不用hibernate时建立pojo类要在员工类Emp中加入一个属性,即部门编号deptid.使用hibernate则不同了,需要在“一”的一方类中加入一个set集合,里面存放“多”的一方的对象。而在“多”的一方的类中需要加入一个“一”方的对象。也就是说在Dept类中需要加入一个set集合,存放Emp对象,因为一个部门里面对应多个员工,所以用一个集合来表示。而每一个员工只能属于一个部门,所以员工类Emp里面需要加入一个Depe类对象,表示所属部门。部门类和员工类的代码如下
package com.java.bean; import com.java.bean.Department; /*员工*/
public class Employee {
private int id;
private String name;
private Department department; public int getId() {
return id;
} public void setId(int 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;
}
@Override
public String toString() { return name;
}
}
然后是它的配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.java.bean">
<class name="Employee" table="t_employee">
<id name="id" column="id" type="int">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string" length="40"></property>
<many-to-one name="department" class="Department" column="department_id" ></many-to-one> </class> </hibernate-mapping>
many-to-one属性: 多一对一
* name:设定待映射的持久化类的名字。
* column:设定和持久化类的属性对应的表的外键。
* class:设定持久化类的属性的类型。
* not-null:是否允许为空。
然后是我们的 Department
package com.java.bean; import java.util.Set; public class
Department {
private int id;
private String name;
private Set<Employee> employees; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Employee> getEmployees() {
return employees;
} public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
@Override
public String toString() { return name;
}
}
他的配置文件就比较重要 了 要开启维护
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.java.bean">
<class name="Department" table="t_department">
<id name="id" column="id" type="int">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string" length="40"></property>
<set name="employees" inverse="true" lazy="extra" >
<key column="department_id"></key>
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
innerse 的属性是true则为开启 然后我们要写一个dao类 也就是增删改查大礼包
package cn.java.dao; import java.util.Iterator;
import java.util.List; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import cn.java.domain.Employee;
import cn.java.domain.User; public class EmployeeDao {
private static SessionFactory sf;
static {
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
sf = cfg.buildSessionFactory();// 获得会话工厂
} // 增加
public void add(Employee emp) {
// 读配置文件,会
Session s = sf.openSession();
Transaction t = null;
try {
t = s.beginTransaction();
s.save(emp);
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
s.close();
} }
//查询
public Employee findEmployeeById(int id){
Session s = sf.openSession();
Transaction t = null;
Employee em = null;
try {
t = s.beginTransaction();
em = (Employee) s.get(Employee.class, id);
//em = s.createQuery("FROM t_employee e where e.id=1").list();
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
s.close();
}
return em;
}
//查询所有
public List<Employee> findEmployee(){
Session s = sf.openSession();
Transaction t = null;
List<Employee> list = null;
try {
t = s.beginTransaction();
//em = (Employee) s.get(Employee.class, id);
list = s.createQuery("FROM Employee e where e.id=1")//
.setCacheable(true)//
.list();
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
s.close();
}
return list;
} //查询 2级缓存 滑稽
public Iterator<Employee> findEmployeeIt(){
Session s = sf.openSession();
Transaction t = null;
Iterator<Employee> it = null;
try {
t = s.beginTransaction();
//em = (Employee) s.get(Employee.class, id);
it = s.createQuery("FROM Employee e where e.id=1").iterate();
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
//s.close();
}
return it;
}
//移除关系
public Employee removeRelation(int id){
Session s = sf.openSession();
Transaction t = null;
Employee em = null;
try {
t = s.beginTransaction();
em = (Employee) s.get(Employee.class, id);
em.setDepartment(null);
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
s.close();
}
return em;
} //删除
public void deleteEmployee(int id){
Session s = sf.openSession();
Transaction t = null;
Employee em = null;
try {
t = s.beginTransaction();
em = (Employee) s.get(Employee.class, id);
s.close();
em.setName("haoren");
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
s.close();
} }
//更新
public void updateEmployee(int id){
Session s = sf.openSession();
Transaction t = null;
Employee em = null;
try {
t = s.beginTransaction();
em = (Employee) s.get(Employee.class, id);
s.close();
em.setName("haoren");
t.commit();
} catch (Exception e) {
t.rollback();
throw new RuntimeException(e);
} finally {
s.close();
} } }
ps如果觉得我加载文件的 方法过时了可以换成 如下
private static SessionFactory sf;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sf = configuration.buildSessionFactory(serviceRegistry);
}catch (Exception e){
throw e;
}
}
嗨呀如果需要测试了方法的请留言 emmmm屁股坐太久麻木了......
hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有的更多相关文章
- Django框架表关系外键-多对多外键(增删改查)-正反向的概率-多表查询(子查询与联表查询)
目录 一:表关系外键 1.提前创建表关系 2.目前只剩 书籍表和 书籍作者表没创建信息. 3.增 4.删 5.修改 二:多对多外键增删改查 1.给书籍绑定作者 2.删 3.修改 4.清空 三:正反向的 ...
- SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份
SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...
- 用SQLAlchemy创建一对多,多对多关系表
多对多关系表的创建: 如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').fi ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- Django-website 程序案例系列-7 创建多对多关系表
创建多对多关系表: 方式一:一共三张表其中有一张中间表需要手工建立(建议使用第一种方式自定制程度高) class Host(models.Model): hostname = models.CharF ...
- 多对多关系表的创建方式、forms组件
目录 多对多关系表的三种创建方式 1.全自动,Django自动创建 2.纯手撸 3.半自动(推荐使用) forms组件 小例子 forms组件 校验器 钩子函数 局部钩子 全局钩子 forms组件常用 ...
- django(七)之数据库表的单表-增删改查QuerySet,双下划线
https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...
- 在django中使用orm来操作MySQL数据库的建表,增删改
多张表之间的三种关系:一对一,一对多,多对多 创建表 一对一 xx = models.OneToOneField(to='表明',to_field='字段名',on_delete=models.CAS ...
随机推荐
- Java基础语法<十一> 异常 断言 日志 调试
1 处理错误 1.1 异常分类 Error类层次描述了Java运行时系统的内部错误和资源耗尽错误. 设计Java程序时,主要关注Exception层次结构. 由程序错误导致的异常属于RuntimeEx ...
- Java 基本语法----关键字、标识符
关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class interface enum byte ...
- CSS预编译与PostCSS以及Webpack构建CSS综合方案
CSS全称Cascading Style Sheets(层叠样式表),用来为HTML添加样式,本质上是一种标记类语言.CSS前期发展非常迅速,1994年哈肯·维姆·莱首次提出CSS,1996年12月W ...
- UWP中使用Composition API实现吸顶(1)
前几天需要在UWP中实现吸顶,就在网上找了一些文章: 吸顶大法 -- UWP中的工具栏吸顶的实现方式之一 在UWP中页面滑动导航栏置顶 发现前人的实现方式大多是控制ListViewBase的Heade ...
- Centos7 安装keepalived实现高可用
场景:尝试安装keepalived实现高可用,进而在suse环境中部署. 测试过程需要配合Nginx的相关知识:Centos7 Nginx安装 1 安装过程 问题 !!! OpenSSL is not ...
- C#的基础数据类型
一.概述 C# 的类型系统是统一的,因此任何类型的值都可以按对象处理.C# 中的每个类型直接或间接地从 object 类类型派生,而 object 是所有类型的最终基类.C#的数据类型主要分为三类:值 ...
- phpunit实践笔记
phpunit成为单元测试的代名词已成为共识, 但很多在实际编写测试过程中遇到的很多问题通过手册.网上搜索都很难找到相关资料, 大部分都得通过查看源代码和实践的代码经验解决.欢迎大家拍砖.(在此之前请 ...
- jquery 的页面下拉选项
<!-- field的属性对应数据库表的内容 --> <th field="ANSWERNUM" formatter="formatterOption& ...
- JSP制作简单登陆
JSP制作简单登陆界面 运行环境 eclipse+tomcat+MySQL 不知道的可以参考Jsp运行环境--Tomcat 项目列表 这里我先把jsp文件先放在Web-INF外面访问 需要建立的几个文 ...
- 一个想法照进现实-《IT连》创业项目:聊聊IT连App是如何思考解决IT人员单身问题的
前言: 根据最早我编写的IT联盟社区众筹计划书的思路方向:社交->资讯=>评级=>培训. 现在在实现第一个阶段中,而且这个阶段可能会走很久. 今天开文,主要是讲述一下,现在的版本为什 ...