Hibernate常用查询与CUD操作详解

需积分: 50 1 下载量 177 浏览量 更新于2024-09-10 收藏 102KB DOC 举报
Hibernate是一种流行的Java ORM框架,用于简化与关系数据库的交互,特别是在Java应用程序中。本文档将详细介绍作者基于个人经验所分享的Hibernate常用API,特别是针对查询和CUD(Create, Update, Delete)操作,这些在实际开发中至关重要。 首先,作者假设我们有两个关联实体:Member和UserInfo。Member表包含了用户的登录代码(loginCode)、密码(password)等信息,其主键(id)自动生成,且与UserInfo表通过外键关联。UserInfo表则存储用户的基本信息,如姓名(name)、编码(code)、生日(birthday)、地址(address)、创建时间(createTime)以及一个删除标志(deleteFlag),还包含一个Member集合,表示一个用户可以关联多个会员信息。 1. **查询功能**: Hibernate提供了多种查询方式,以适应不同场景。其中,最基础的是使用HQL(Hibernate Query Language)进行数据库查询。HQL是一种面向对象的查询语言,能够跨数据库平台编写统一的SQL语法。例如,要执行一个简单的查询,你可以创建一个Query对象,如`getSession().createQuery("FROM Member")`,这将返回一个结果集,包含了Member表中的所有记录。 1-1 **HQL查询示例**: 使用HQL的一个例子是执行`SELECT * FROM Member`,这将返回Member表中的所有列。HQL允许我们更精确地筛选和排序数据,比如`SELECT m FROM Member m WHERE m.loginCode = :loginCode`,这样可以根据loginCode查找特定的成员。 2. **CUD操作**: - **Create(创建)**:在Hibernate中,使用Session的save()方法可以保存一个新的对象到数据库,如`session.save(new Member(loginCode, password))`。如果对象已经存在,Hibernate会自动检测并更新对应的记录,而不是插入新行。 - **Update(更新)**:使用update()方法更新已有对象,如`session.update(member)`,这里的`member`对象的属性已经被修改,会在数据库中反映出来。 - **Delete(删除)**:使用delete()方法删除对象,如`session.delete(member)`,前提是要确保对象的状态为管理状态(即已被Session管理)。 3. **一对多和一对一关联**: 在Member和UserInfo的例子中,Member有一个ManyToOne关联,表示一个Member关联一个UserInfo。当保存Member时,Hibernate会自动处理Userinfo对象的关联,确保外键引用正确。同样,如果在UserInfo中修改了与Member的关联,也会影响到Member对象。 4. **事务管理**: Hibernate支持事务管理,使用Transaction接口或注解(如@Transactional)来控制数据库操作的原子性。在完成一组相关的操作后,可以提交事务(session.getTransaction().commit())以持久化更改,或者回滚(session.getTransaction().rollback())以撤销未完成的操作。 这个文档详细介绍了Hibernate在日常开发中常用的API,包括查询和基本的CRUD操作,以及如何处理对象之间的关联。熟练掌握这些API有助于提高开发效率和数据库操作的灵活性。
2019-02-28 上传
2012-02-16 上传
依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be