1.save()方法
/*
* save()
* 1.使一个临时对象变成一个持久化对象。
* 2.为对象分配id
* 3.在flush缓存时会发送一条insert语句
* 4.在save方法是之前设置id时无效的
* 5.持久化对象的id是无法改变的
*/
@Test
public void testSave(){
News news = new News();
news.setId(100); //在save方法是之前设置id时无效的
news.setName("aa");
news.setGender("ss");
news.setDateTime(new Date());
System.out.println(news);
session.save(news);
news.setId(101); //持久化对象的id是无法改变的
System.out.println(news);
}
2.persist()方法
/*
* persist()方法也会执行insert操作
*
* persist() VS save();
* 在调用persist方法之前如果已经有id了,则不会执行inset操作,会抛出异常。
*/
@Test
public void testPersist(){
News news = new News();
news.setId(100);
news.setName("ee");
news.setGender("ee");
news.setDateTime(new Date());
session.persist(news);
}
3. get()方法 VS load()方法
/*
* get() VS load()
* 1.执行get方法:会立即加载对象
* 执行load方法:若不使用该对象,则不会立即执行查询操作,而是返回一个代理对象
*
* get时立即检索 load是延迟检索
*
* 2.若数据库中没有对应的记录,session没有被关闭:
* get返回null
* load 不使用该对象的属性的话没问题;若使用对象的属性,会抛出异常
*
* 3.load方法可能会抛出LazyInitializationException 异常:
* 代理对象需要初始化时之前已经关闭了session
*
*/
@Test
public void testGet(){
News news = (News) session.get(News.class,15);
System.out.println(news);
}
@Test
public void testLoad(){
News news = (News) session.load(News.class,15);
System.out.println(news.getClass().getName());
}
4.update()方法
/*
* update():
* 1.若要更新一个持久化对象,不需要显示的调用update()方法。因为
* Transaction在commit()之前,会调用session的flush方法。
*
* 2.若要更新一个游离对象,需要显示的调用session的update方法。
* 可以把一个游离对象转化为一个持久化对象。
*
* 注意:1.无论更新的游离对象是否和数据库的对象一致,都会发送update语句
* 原因:游离对象并不是在同一个session里,则无法保证是该游离对象是否
* 一致,所以需要发送update语句
*
* (在更新持久化对象的时候,如果和数据库的对象一致,则不会发送update语句
* 原因:在事务最终commit之前,会调用session的flush方法,去检查是否与数据库对象
* 一致。只有在不一致的情况下,才会发送update语句
* )
*
* 2.若查询数据库不存在的游离对象,则会抛出异常。
*
* 3.当 update() 方法关联一个游离对象时,
* 如果在 Session 的缓存中已经存在相同 OID 的持久化对象,
* 会抛出异常。因为session缓存中,不能同时拥有两个OID一样的持久化
* 对象。
News news = (News) session.get(News.class,5);
transaction.commit();
session.close();
session =sessionFactory.openSession();
transaction = session.beginTransaction();
News news2 = (News) session.get(News.class,5);
* session.update(news);
*/
@Test
public void testUpdate(){
News news = (News) session.get(News.class,5);
transaction.commit();
session.close();
session =sessionFactory.openSession();
transaction = session.beginTransaction();
//news.setName("rr");
session.update(news);
}
5.delete()方法:
/*
* delete:
* 1.执行删除操作,只要OID和数据表中的一条记录对应,就会准备执行delete操作。
* 2.若OID在数据表中没有对应的记录,则会抛出异常。
*
*
*/
@Test
public void testDelete() {
News news = (News) session.get(News.class,5);
session.delete(news);
}
6.evict()方法:
/*
*evict():从session中把指定的持久化对象移除。
*/
@Test
public void testEvict() {
News news = (News) session.get(News.class,7);
News news1 = (News) session.get(News.class,6);
news.setName("qq");
news1.setName("qq");
session.evict(news1);
}