Hibernate API
http://docs.jboss.org/hibernate/core/3.2/api/
1、对象的三种状态
三种状态的区别在于:
有没有ID,ID在数据库中有没有,在内存中有没有(session缓存)
三种状态
Transient:内存中的一个对象,没有ID,缓存中也没有
Persistent:内存中有,缓存中有,数据库中有ID
Detached:内存中有,缓存中没有,数据库有ID
2、Session
管理一个数据库的任务单元,即管理数据库中的增删改查操作,
提交事务.
方法CRUD:save(),delete(),update(),saveOrUpdate(),load(),get(),clear().
session.beginTransaction();
session.save(Object obj);
session.getTransaction().commit();
session.close();
3、get()与load()的区别
l 查找时,都会优先从session的缓存中查找.
l 查找不存在对应记录时,表现不一样.load方法查找不到时不会报错,get查找不到时会报错.
l Load返回的是代理对象,等到真正要用到对象的内容时才发起SQL语句.get直接发起SQL语句从数据库中取出,不会延迟.
4、Update()方法
1 用来更新detached对象,更新完成之后成为persistent.
2 更新 transient 对象会报错 . 更新自己设定 id( 前提是 id 在数据库中存在 ) 的 transient 对象可以 .3 持久化的对象只要设定不同字段就会发生更新
4 更新部分更改的字段(三种方法)
l XML设定property标签的update=true|false属性,
annotation设定@Column(updatable=false)属性,这种方式少用,不灵活.
l XML设定class标签的dynamic-update=”true”属性,
同一个session中可以,跨session不行.跨session时的实现方法不过可以用session的merge().merge方法会先从数据库load,将得到的和数据库中的进行对比,再update更改过的字段.
JPA1.0 Annotation没有对应的属性,Hibernate
l 使用HQL(EJBQL)(建议使用)
Session se = sessionFactory.openSession(); se.beginTransaction(); Query query = se.createQuery("update Users u set u.name='abcdef' where u.id='5'"); query.executeUpdate(); se.getTransaction().commit();
clear()方法:
清除session中的缓存.调用clear()方法会强制清除session缓存.不会与数据库打交道.
flush()方法:
当session的事务提交后,会强制进行从内存(session缓存)到数据库的同步.默认情况下是session的事务提交时才同步.不常用.
public class UsersTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass() {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}
@Test
public void testUsersSave() {
Users users = new Users();
users.setName("xiaomi");
users.setPassword("1234444");
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(users);
session.getTransaction().commit();
}
@Test
public void testUsersDelete() {
Users users = new Users();
users.setId(7);
Session session = sessionFactory.openSession();
session.beginTransaction();
session.delete(users);
session.getTransaction().commit();
}
@Test
public void testLoad() {
Session session = sessionFactory.openSession();
session.beginTransaction();
Users users = (Users) session.load(Users.class, 8);
System.err.println(users.getName());
session.getTransaction().commit();
}
@Test
public void testGet() { //从数据库中获取一条记录转换成对象
Session session = sessionFactory.openSession();
session.beginTransaction();
Users users = (Users) session.get(Users.class, 8);
System.err.println(users.getName());
session.getTransaction().commit();
}
@Test
public void testUpdate1() {
Session session = sessionFactory.openSession();
session.beginTransaction();
Users users = (Users) session.get(Users.class, 8);
System.err.println(users.getName());
session.getTransaction().commit();
users.setName("hhhhh");
Session se = sessionFactory.openSession();
se.beginTransaction();
se.update(users);
se.getTransaction().commit();
}
@Test
public void testUpdate2() {
Users users = new Users();
users.setId(5);
users.setName("haaaah");
users.setPassword("11111");
Session se = sessionFactory.openSession();
se.beginTransaction();
se.update(users);
se.getTransaction().commit();
}
@Test
public void testUpdate3() {
Session se = sessionFactory.openSession();
se.beginTransaction();
Query query = se.createQuery("update Users u set u.name='abcdef' where u.id='5'");
query.executeUpdate();
se.getTransaction().commit();
}
@Test
public void testSChemaExport(){ //生成建表语句
new SchemaExport(new AnnotationConfiguration().configure()).create(true, false);
}
}