`
schy_hqh
  • 浏览: 558029 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate3_NEW

 
阅读更多

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_tar

    hibernate_note_new_tarhibernate_note_new_tar

    hibernate_first_new项目源码

    【hibernate_first_new项目源码】是一个关于Hibernate框架学习的项目,主要涵盖了对Hibernate常用接口的详细讲解和实例应用。Hibernate是一个强大的Java持久层框架,它为开发者提供了对象关系映射(ORM)功能,使得...

    Hibernate_Tools_for_Eclipse插件的安装和使用

    安装完毕后,创建一个新的 Hibernate 工程,选择 File -New -Hibernate Configuration File(cfg.xml),打开创建 Hibernate 配置向导。 1. 配置 Hibernate 控制台配置,选择 Create a console configuration 复选...

    hibernate_new.pdf

    hibernate_new.pdf。是尚学堂马士兵老师讲解hibernate的笔记的PDF版本。

    java视频教程_hibernate3.3.2_项目源码

    3. Hibernate配置:学习如何设置Hibernate的配置文件(hibernate.cfg.xml),包括数据库连接、实体类的映射等。 4. Session API:理解Session对象的作用,如何创建、保存、更新和删除数据。 5. Criteria查询和HQL:...

    hibernatesynchronizer_3.1.9

    3. 安装:打开Eclipse,进入“Help” -&gt; "Install New Software",选择“Add”按钮,输入本地路径至解压后的文件夹。 4. 确认:按照提示完成安装,重启Eclipse,插件即安装成功。 四、使用指南 1. 配置连接:在...

    struts2 hibernate spring case_new

    struts2 hibernate spring case_new

    JavaEE技术-自主学习.zip_hibernate_hibernate session _javaee映射.xml

    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); ...

    Hibernate 课件_HQL

    - `private static ThreadLocal&lt;Session&gt; sessionThreadLocal = new ThreadLocal();` - 在需要的地方获取当前线程的`Session`: - `Session session = sessionThreadLocal.get();` 以上就是关于Hibernate中HQL...

    jet3_new.zip_NEW

    标题中的"jet3_new.zip_NEW"可能是一个包含相关项目源码或配置的压缩包,更新版本为"NEW"。下面将详细介绍这三个关键技术及其相互间的整合。 **jbpm** jbpm是一个开源的工作流和业务流程管理系统,它提供了一套完整...

    hibernate_new

    【hibernate_new】压缩包文件包含了尚学堂马士兵老师教授JAVA EE中Hibernate框架的教程资料,这是一份详尽且全面的学习资源,适合正在学习或想要深入理解Hibernate的开发者。Hibernate作为Java领域中广泛使用的对象...

    06_传智播客hibernate教程_完善HibernateUtil类及hql查询入门

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存取细节。本教程聚焦于“完善HibernateUtil类及HQL查询入门”,让我们深入探讨这...

    Hibernate_Tools_for_eclipse_HbmTool.rar

    在Package中输入包名(你要存放到src下那个包中),最后单击Setup-Create New打开Reverse engineer配置向导,选择配置存储位置(我放到了src目录下),最后选择要反向工程的表,如图; 如果你的Database schema...

    hibernate5_ManyToMany多对多单向维护

    private Set&lt;Role&gt; roles = new HashSet(); // getters and setters } ``` 在`User`实体中,我们使用`@ManyToMany`注解来声明多对多关联,并通过`@JoinTable`注解指定中间表`user_roles`,以及两个实体在中间...

    hibernateTools3.3

    3. **设置数据库连接**:在Hibernate配置文件(hibernate.cfg.xml)中指定数据库连接信息。 4. **反向工程**:使用Hibernate Tools生成实体类和映射文件,或者根据实体类生成数据库表。 5. **运行Ant/Maven任务**:...

    Hibernate_Tools_for_Eclipse插件的安装包和使用说明

    1. **创建Hibernate项目**: 新建一个Java项目,然后右键点击项目,选择`New` -&gt; `Other` -&gt; `Hibernate` -&gt; `Hibernate Project`。按照向导设置项目的ORM配置,包括JDBC驱动、数据库连接等。 2. **反向工程数据库**...

    Hibernate_api.zip_hibernate api

    Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); ``` 3. **打开Session**:使用SessionFactory获取Session实例,开始数据库操作。 ```...

    一个简单的hibernate_4 链接Oracle例子

    3. **映射文件** (.hbm.xml): 虽然在Hibernate 4中,注解已经成为主要的映射方式,但某些情况下,开发者仍可能使用XML映射文件。映射文件定义了实体类与数据库表之间的关系。如果使用XML映射,`User`类的映射文件...

    Eclipse_hibernate-3.1.2_(插件

    3. **对象关系图(OR图)**:可视化工具能够展示实体类之间的关系,便于理解和调整数据模型。 4. **HQL/SQL编辑器**:内置的HQL和SQL编辑器提供语法高亮、自动完成和错误检查,提升查询编写体验。 5. **数据浏览与...

    Hibernate3使用经验

    ### Hibernate3 使用经验 #### 一、在 Hibernate 中配置参数 在 Hibernate 框架中,我们可以使用两种方法来配置参数: 1. **根据参数名称设置参数**:这是较为直观的一种方式,它允许我们直接通过参数名来进行...

Global site tag (gtag.js) - Google Analytics