在测update方法之前,我们看读取:get和load。
load就是从数据库里取一条记录,取到内存里,把一条记录转化成对应的对象。
测试代码:
package hjj.lch.hibernate.model;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class HibernateCoreAPITest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testSave() {
Teacher t = new Teacher();
t.setName("t1");
t.setTitle("中级");
Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(t); // save后,t变成了Persistent状态
System.out.println(t.getId());
session.getTransaction().commit(); // commit之后,t变成了Detached状态
}
@Test
public void testLoad() {
Session session = sf.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class,1);
System.out.println(t.getName());
session.getTransaction().commit();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
运行后台打印结果:
14:10:57,792 INFO SchemaExport:226 - Running hbm2ddl schema export
14:10:57,792 DEBUG SchemaExport:242 - import file not found: /import.sql
14:10:57,792 INFO SchemaExport:251 - exporting generated schema to database
14:10:57,802 DEBUG SchemaExport:377 -
drop table if exists Student
14:10:57,832 DEBUG SchemaExport:377 -
drop table if exists Teacher
14:10:57,852 DEBUG SchemaExport:377 -
create table Student (
id integer not null,
name varchar(16) not null,
age integer,
primary key (id, name)
)
14:10:57,952 DEBUG SchemaExport:377 -
create table Teacher (
id integer not null auto_increment,
name varchar(255),
title varchar(255),
primary key (id)
)
14:10:58,042 INFO SchemaExport:268 - schema export complete
Hibernate:
insert
into
Teacher
(name, title)
values
(?, ?)
1
Hibernate:
select
teacher0_.id as id1_0_,
teacher0_.name as name1_0_,
teacher0_.title as title1_0_
from
Teacher teacher0_
where
teacher0_.id=?
t1
/**
* Load和Get都能把数据从数据库中取出,但是它们两个之间有重要的区别
* 当我们用session.Get()去拿一个对象的时候,它马上会发出sql语句,然后从数据库里面取出这个数据的值来给它装到这个对象里面去
* 但是如果用session.Load()拿时,生成的是这个对象的一个代理,这个代理并没有真正的发出sql语句。
* 这个sql语句是在我们需要拿它里面的一个属性的时候才会发出
*/