Hibernate的数据删除,更改
其他未给出代码,请参考上一篇....
一.数据的删除
方法1.从“多”的一方进行数据的删除
books.hbm.xml文件不变:
<many-to-one name="publishers" column="publisherId" class="com.entry.Publishers" lazy="false"
cascade="save-update"/>
publishers.hbm.xml文件:
<set name="books" lazy="false" cascade="all" inverse="true"> <!-- cascade="save-update" 也可以 -->
<key column="publisherId" not-null="true"/>
<one-to-many class="com.entry.Books"/>
</set>
在MyHibernateDao.java中添加如下代码:
public Books getBook(int Id){
Books book = null;
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
book = (Books)session.get(Books.class, new Integer(Id));
tran.commit();
return book;
} public void deleteBook(Books book){
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
session.delete(book);
tran.commit();
}
在HibernateServlet.java中添加如下代码
Books book1 = dao.getBook(3);
book1.getPublishers().getBooks().remove(book1);
book1.setPublishers(null);
dao.deleteBook(book1);
注意如果没有book1.getPublishers().getBooks().remove(book1); book1.setPublishers(null);这两句,会出现 org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)这个异常,主要是因为Books和Publishers二者的级联关系。
所以我们可以先将级联断开,然后再进行删除“多”的一方。
方法2.从“一”的这一方进行删除,这样的话就是和“一”这一方相关联的“多”的一方都会被删除
在HibernateServlet.java中添加如下代码:
Publishers publisher = dao.getPublisher(1);
dao.deletePublisher(publisher);
publishers.hbm.xml 和 books.hbm.xml 不用改变
在MyHibernateDao.java中添加如下代码:
public Publishers getPublisher(int Id){
Publishers publisher = null;
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
publisher = (Publishers)session.get(Publishers.class, new Integer(Id));
tran.commit();
return publisher;
} public void deletePublisher(Publishers publisher){
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
session.delete(publisher);
tran.commit();
}
二.数据的删除
在MyHibernateDao.java中添加如下代码:
public void updateBooks(Books book){
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
session.update(book);
tran.commit();
}
在HibernateServlet.java中添加如下代码
//更改数据, 更改对应的外键
Books book1 = dao.getBook(79);//将book1的publisherId替换成46
/////较为安全的写法,然而并不知道有什么卵用
Publishers px = dao.getPublisher(book1.getPublishers().getPublisherId());
px.getBooks().remove(book1);
Publishers py = dao.getPublisher(46);
py.getBooks().add(book1);
/////
book1.setPublishers(py);
dao.updateBooks(book1); //更改数据,Books
Books book2 = dao.getBook(79);
book2.setTitle("如何成为成功的人士");
dao.updateBooks(book2);
其他不变....
Hibernate的数据删除,更改的更多相关文章
- Hibernate 插入,修改,删除,查询语句
/* *具体操作hibernate的类 *增加,删除,修改,按ID查询,模糊查询,查询全部 **/ public class PersonOperate { //在hibernate中所有操作都是由S ...
- Hibernate的数据查找,添加!
1.首先看一下测试数据库的物理模型 2.测试所需要的Hibernate的jar包 3.数据库的sql /*=============================================== ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- hibernate有关联关系删除子表时可能会报错,可以用个clear避免错误
//清除子表数据 public SalesSet removeSalesSetDistributor(SalesSet salesSet ){ List<SalesSetDistributor& ...
- Django 数据表更改
Django 数据表更改 « Django 开发内容管理系统(第四天) Django 后台 » 我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要用到本节的知识. D ...
- 【Hibernate】数据Session对象的常规操作收集
因为Hibernate是ORM(对象关系映射)的,所以程序员是不需要写Sql语句的.所有的操作都是通过对对象的操作. 1,原生Session 事务管理 Transaction tx = session ...
- Hibernate修改操作 删除操作 查询操作 增加操作 增删改查 Hibernate增删查改语句
我用的数据库是MySQL,实体类叫User public class User { private Integer uid; private String username; private Stri ...
- vue element-ui el-date-picker 数据可以更改,但是前端不显示的更改后的数据问题
template: <el-form-item label="有效时间:" prop="validTime"> ...
- Dynamic CRM一对多关系的数据删除时设置自动删除关联的数据
在业务实体中主子表非常常见,然后子表可能有会有自己的子表或者多对多关系,在删除的业务场景下,删除主数据,剩余的子数据就成了脏数据, 之前的做法是,监听主表的删除事件,然后在插件中找到其下的子表数据然后 ...
随机推荐
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- C++ Primer Plus 第六版笔记
C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...
- PHP定界符使用技巧
为什么要使用定界符 : 因为PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法——按字符串输出的话,肯定要有大量的转 ...
- socket.io安装部署
需要node.js环境 创建package.json npm init 下载相关依赖 npm install --save express@4.10.2npm会在当前目录下载所需要的依赖到node_m ...
- NLP--十项沟通前的思想准备
如何达到有效沟通?sino NLP课程给我们十项针对沟通前的思想准备,可让我们了解怎样做到效果卓越的沟通: 1.建立和谐气氛. 这是有效沟通的前提条件,只有首先建立一个和谐的气氛,双方才能彼此敞开心扉 ...
- ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)
前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程 ...
- Hybrid App移动应用开发初探
一.移动App类型及其优缺点 1.1 Native App Native App(原生App)是用原生语言(Object-C/Java/C#/....)开发,用户需要下载安装的手机应用. 优点是 可以 ...
- [转] Agile Software Development 敏捷软件开发
原文作者:kkun 原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷是什么 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- 关于Unicode,字符集,字符编码,每个程序员都应该知道的事
关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...