JAP是一个规范,Hibernate是该规范的一种实现
DAO 模式 Data Access Object
将数据访问与业务逻辑相分离
Service层完全不关心DAO层如何与数据库交互,只需要将请求交给DAO层即可
POJO Plain Ordinary Java Object 没有业务逻辑代码的值对象
PO Persistence Object 进行数据存储的对象,如Entity实体对象
VO Value Object 值对象,用来进行一些数据临时封装的对象
DTO Data Transfer Object 与VO类似吧
Hibernate配置文件中的属性配置
通过Hibernate目录下的etc/hibernate.properties文件,根据其中定义的属性进行配置
hbm2ddl.auto属性的说明:
create-drop 每次运行都先创建表,运行结束后,再删除表
create 每次运行都会先删除表(如果存在),再创建表(测试时用,便于清理上一次的数据)
update 如果表结构不对应,则进行更新(不会删除已存在的多余字段)
validate 校验实体与表是否对应,如果不对应,则报错(确保表结构的稳定)
JDBC操作数据库,默认自动提交,除非设置autoCommit(false);
Hibernate缺省不自动提交,必须在一个Transaction中进行显示提交;
SessionFactory
负责创建Session,它通过读取Hibernate配置文件,使用Configuration对象创建SessionFactory
openSession() 每次打开一个新的Session会话对象;
getCurrentSession() 获取与当前线程绑定的Session对象,确保在1个事务中使用的是同一个Session会话进行数据操作;
Transaction
在于数据库进行交互的过程中,事务非常非常的重要!
必须保证Session在事务中进行,要么全部操作成功,要么全部回退
========================================================================
Hibernate对象的3种状态及其转换
session中维护了1个Map,session.save(obj)就是把obj对象放入到Map中
Hibernate会在某个时候,批量的将Map中的对象持久化到数据库中
Transient
瞬时对象,跟session没有关系,数据库中没有对应的记录
new() 新创建的对象
session.delete() 数据库中没有对应记录,但内存中该对象仍存在
Persistent
持久化对象,被session所管理(被放到session内部的Map中),数据库中有对应的记录
session.get()
session.load()
session.save()
session.saveOrUpdate()
session.update()
Detached
离线对象,不被session对象管理,数据库中有对应的记录
session.evit()
session.clear()
session.close()
session.get()
先找一级缓存,无--->找二级缓存,无--->查询数据,无---> retrun null
session.load()
返回代理对象
获取property时查询数据库,无---> 抛异常
========================================================================
Hibernate主键生成策略
native
将主键生成工作交给数据库完成,不同数据库有不同的主键生成机制
mysql,sql server采用identity
oracle 采用sequence
assigned
由程序员手动分配id
sequence
Oracle的主键生成机制,当使用Oracle数据库时使用
identity
MySQL或SqlServer数据库使用
hilo
高低位算法生成数据库主键值
uuid
uuid.hex,全网络上主键都是唯一的
========================================================================
Cascade
all 将所有类型的操作都级联到关联对象上
save-update 保持和更新时进行级联保持或更新
delete 删除时进行级联删除
all-delete-orphan 当被关联对象失去宿主时,将其级联删除
none 不进行级联操作
Inverse(等效于mappedBy)
默认inverse=false, 则"一方"与"多方"都可以维护关联关系
让"一方"维护关联,Hibernate将额外发出update语句更新"多方"的外键,不推荐
inverse=true,强制将关联关系交给"多方"进行维护
========================================================================
通过一个基类来定义统一的ID生成机制,子类继承即可
package model; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @MappedSuperclass public class BaseEntity { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } }
一对多单向关联 One To Many
一方
@Entity @Table(name="t_group") public class Group extends BaseEntity { private String name; @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="gid") //如果没有指定JoinColumn,Hibernate会创建第3张表存储关联关系 private Set<Person> persons; public Group() {} public Group(String name) { this.name = name; } public Set<Person> addPerson(Person p) { if(persons == null) { persons = new HashSet<Person>(); } persons.add(p); return persons; } //getters&setters }
多方
@Entity public class Person extends BaseEntity { private String name; public Person() {} public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
@Test public void testOne2Many() { session.beginTransaction(); Group g = new Group("g1"); Person p1 = new Person("p1"); Person p2 = new Person("p2"); g.addPerson(p1).add(p2);//通过一端保存关联关系 session.save(g); session.getTransaction().commit(); }
将发出额外的update语句来设置外键(因为外键字段在多的一方的表中)
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into Person (name) values (?)
Hibernate: insert into Person (name) values (?)
Hibernate: update Person set gid=? where id=?
Hibernate: update Person set gid=? where id=?
一对多双向关联 One To Many
一方
@Entity @Table(name="t_group") public class Group extends BaseEntity { private String name; @OneToMany(mappedBy="group",cascade=CascadeType.REMOVE) private Set<Person> persons; public Group() {} public Group(String name) { this.name = name; } public Set<Person> addPerson(Person p) { if(persons == null) { persons = new HashSet<Person>(); } persons.add(p); return persons; } getters&setters }
多方
@Entity public class Person extends BaseEntity { private String name; @ManyToOne @JoinColumn(name="gid") private Group group; public Person() {} public Person(String name) { this.name = name; } getters&setters }
@Test public void testOne2Many2() { session.beginTransaction(); Group g = new Group("g1"); session.save(g);//先持久化,避免TransientException Person p1 = new Person("p1"); Person p2 = new Person("p2"); //通过多方保存关联,不会发出额外的update语句 p1.setGroup(g); p2.setGroup(g); session.save(p1); session.save(p2); session.getTransaction().commit(); }
没有额外的update语句发出
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into Person (gid, name) values (?, ?)
Hibernate: insert into Person (gid, name) values (?, ?)
相关推荐
hibernate_note_new_tarhibernate_note_new_tar
【hibernate_first_new项目源码】是一个关于Hibernate框架学习的项目,主要涵盖了对Hibernate常用接口的详细讲解和实例应用。Hibernate是一个强大的Java持久层框架,它为开发者提供了对象关系映射(ORM)功能,使得...
安装完毕后,创建一个新的 Hibernate 工程,选择 File -New -Hibernate Configuration File(cfg.xml),打开创建 Hibernate 配置向导。 1. 配置 Hibernate 控制台配置,选择 Create a console configuration 复选...
hibernate_new.pdf。是尚学堂马士兵老师讲解hibernate的笔记的PDF版本。
3. Hibernate配置:学习如何设置Hibernate的配置文件(hibernate.cfg.xml),包括数据库连接、实体类的映射等。 4. Session API:理解Session对象的作用,如何创建、保存、更新和删除数据。 5. Criteria查询和HQL:...
3. 安装:打开Eclipse,进入“Help” -> "Install New Software",选择“Add”按钮,输入本地路径至解压后的文件夹。 4. 确认:按照提示完成安装,重启Eclipse,插件即安装成功。 四、使用指南 1. 配置连接:在...
struts2 hibernate spring case_new
User user = new User(); user.setUsername("John"); session.save(user); // 更新 user.setEmail("john@example.com"); session.update(user); // 查询 User fetchedUser = (User) session.get(User.class, 1L); ...
- `private static ThreadLocal<Session> sessionThreadLocal = new ThreadLocal();` - 在需要的地方获取当前线程的`Session`: - `Session session = sessionThreadLocal.get();` 以上就是关于Hibernate中HQL...
标题中的"jet3_new.zip_NEW"可能是一个包含相关项目源码或配置的压缩包,更新版本为"NEW"。下面将详细介绍这三个关键技术及其相互间的整合。 **jbpm** jbpm是一个开源的工作流和业务流程管理系统,它提供了一套完整...
【hibernate_new】压缩包文件包含了尚学堂马士兵老师教授JAVA EE中Hibernate框架的教程资料,这是一份详尽且全面的学习资源,适合正在学习或想要深入理解Hibernate的开发者。Hibernate作为Java领域中广泛使用的对象...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存取细节。本教程聚焦于“完善HibernateUtil类及HQL查询入门”,让我们深入探讨这...
在Package中输入包名(你要存放到src下那个包中),最后单击Setup-Create New打开Reverse engineer配置向导,选择配置存储位置(我放到了src目录下),最后选择要反向工程的表,如图; 如果你的Database schema...
private Set<Role> roles = new HashSet(); // getters and setters } ``` 在`User`实体中,我们使用`@ManyToMany`注解来声明多对多关联,并通过`@JoinTable`注解指定中间表`user_roles`,以及两个实体在中间...
3. **设置数据库连接**:在Hibernate配置文件(hibernate.cfg.xml)中指定数据库连接信息。 4. **反向工程**:使用Hibernate Tools生成实体类和映射文件,或者根据实体类生成数据库表。 5. **运行Ant/Maven任务**:...
1. **创建Hibernate项目**: 新建一个Java项目,然后右键点击项目,选择`New` -> `Other` -> `Hibernate` -> `Hibernate Project`。按照向导设置项目的ORM配置,包括JDBC驱动、数据库连接等。 2. **反向工程数据库**...
Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); ``` 3. **打开Session**:使用SessionFactory获取Session实例,开始数据库操作。 ```...
3. **映射文件** (.hbm.xml): 虽然在Hibernate 4中,注解已经成为主要的映射方式,但某些情况下,开发者仍可能使用XML映射文件。映射文件定义了实体类与数据库表之间的关系。如果使用XML映射,`User`类的映射文件...
3. **对象关系图(OR图)**:可视化工具能够展示实体类之间的关系,便于理解和调整数据模型。 4. **HQL/SQL编辑器**:内置的HQL和SQL编辑器提供语法高亮、自动完成和错误检查,提升查询编写体验。 5. **数据浏览与...
### Hibernate3 使用经验 #### 一、在 Hibernate 中配置参数 在 Hibernate 框架中,我们可以使用两种方法来配置参数: 1. **根据参数名称设置参数**:这是较为直观的一种方式,它允许我们直接通过参数名来进行...