Hibernate核心接口

Configuration(AnnotationConfiguration)

作用:进行配置信息的管理

目标:用来产生SessionFactory

可以在configure方法中指定hibernate配置文件,默认(不指定)时在classpath下加载hibernate.cfg.xml文件

加载默认的hibernate的配置文件

sessionFactory factory =new AnnotationConfiguration().configure().buildSessionFactory();

加载指定hibernate的配置文件

sessionFactory factory = newnnotationConfiguration().configure("hibernate.xml").buildSessionFactory();

SessionFactory

作用:主要用于产生Session的工厂(数据库连接池)

当它产生一个Session时,会从数据库连接池取出一个连接,交给这个Session

Session session= sessionFactory.getCurrentSession();

并且可以通过这个Session取出这个连接

getCurrentSession():表示当前环境没有Session时,则创建一个,否则不用创建

openSession():表示创建一个Session(3.0以后不常用),使用后需要关闭这个Session

两方法的区别:

①、openSession永远是每次都打开一个新的Session,而getCurrentSession不是,是从上下文找、只有当前没有Session时,,才创建一个新的Session

②、OpenSession需要手动close,getCurrentSession不需要手动close,事务提交自动close

③、getCurrentSession界定事务边界

所指的上下文是指hibernate配置文件(hibernate.cfg.xml)中的“current_session_context_class”所指的值:(可取值:jta|thread|managed|custom.Class)

<propertyname="current_session_context_class">thread</property>

常用的是:

①、thread:是从上下文找、只有当前没有Session时,才创建一个新的Session,主要从数据界定事务

②、jta:主要从分布式界定事务,运行时需要Application Server来支持(Tomcat不支持)

③、managed:不常用

④、custom.Class:不常用

Session

save()

session.save(Object)

session的save方法是向数据库中保存一个对象,这个方法产生对象的三种状态

delete()

session.delete(Object)

Object对象需要有ID

对象删除后,对象状态为Transistent状态

load()

格式: Session.load(Classarg0,Serializable arg1) throws HibernateException

arg0:需要加载对象的类,例如:User.class

arg1:查询条件(实现了序列化接口的对象)。如果是数值类类型,则hibernate会自动使用包装类,

此方法返回类型为Object,但返回的是代理对象。

执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。

因为load方法实现了lazy(称为延迟加载、赖加载)

延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句)

hibernate延迟加载实现原理是代理方式。

采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)

Get()

格式:Session.get(Classarg0,Serializable arg1)方法

arg0:需要加载对象的类,例如:User.class

arg1:查询条件(实现了序列化接口的对象):如果是基数类型,则hibernate会自动转换成包装类

返回值:此方法返回类型为Object,也就是对象,再强行转换为需要加载的对象就可以了。

如果数据不存在,则返回null;

注:执行此方法时立即发出查询SQL语句。

load()与get()区别

①不存在对应记录时表现不一样;

② load返回的是代理对象,等到真正使用对象的内容时才发出sql语句,这样就要求在第一次使用对象时,要求session处于open状态,否则出错

③get直接从数据库加载,不会延迟加载

get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL

update()

①用来更新detached对象,更新完成后转为为persistent状态(默认更新全部字段)

②更新transient对象会报错(没有ID)

③更新自己设定ID的transient对象可以(默认更新全部字段)

④persistent状态的对象,只要设定字段不同的值,在session提交时,会自动更新(默认更新全部字段)

⑤更新部分更新的字段(更改了哪个字段就更新哪个字段的内容)

a)方法1:update/updatable属性

xml:设定<property>标签的update属性,设置在更新时是否参与更新

<property name="name" update="false"/>

注意:update可取值为true(默认):参与更新;false:更新时不参与更新

annotateon:设定@Column的updatable属性值,true参与更新,false:不参与更新

@Column(updatable=false)

public StringgetTitle(){return title;}

注意:此种方法很少用,因为它不灵活

b)方法2:dynamic-update属性

注意:此方法目前只适合xml方式,JAP1.0annotation没有对应的

在实体类的映射文件中的<class>标签中,使用dynamic-update属性,true:表示修改了哪个字段就更新哪个字段,其它字段不更新,但要求是同一个session(不能跨session),如果跨了session同样会更新所有的字段内容。

<class name="com.bjsxt.Student" dynamic-update="true">

代码:

@Test public void testUpdate5() {Session session =sessionFactory.getCurrentSession();session.beginTransaction();Student s=(Student)session.get(Student.class, 1);s.setName("zhangsan5");//提交时,会只更新name字段,因为此时的s为persistent状态session.getTransaction().commit();s.setName("z4");Session session2 =sessionFactory.getCurrentSession();session2.beginTransaction();//更新时,会更新所有的字段,因为此时的s不是persistent状态session2.update(s);session2.getTransaction().commit(); }一起吃早餐,午餐,晚餐。或许吃得不好,

Hibernate核心接口

相关文章:

你感兴趣的文章:

标签云: