package com.supan.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.supan.bean.News;
import junit.framework.TestCase;
public class HibernateCrudTest extends TestCase {
public void testInsert(){
Configuration config = new Configuration().configure(); //获取配置对象,注意.configure()会自动读取hibernate.cfg.xml文件
SessionFactory sf = config.buildSessionFactory();//创建回话工厂sessionFactory是整个数据库映射关系经过编译后的内存影像,是线程安全的。
Session sess = sf.openSession();
Transaction tx = (Transaction) sess.beginTransaction();
News mynew = new News();
mynew.setTitle("hibernate的神奇");
mynew.setContent("hibernate非常的神奇");
sess.save(mynew); //save返回持久化对象的主键值,persist返回null
tx.commit(); //提交事物
sess.close(); //关闭回话
sf.close(); //关闭工程
System.out.println("插入成功");
/*
* 注意因为该实体在映射文件中已经指定了标示符生成规则,在保存之前会自动的生成一个id分配给对象,并持久化到数据库中
* 如果标示符是assigned或者是符合主键,那么在save之前需要手动分配数值。
* save persist方法功能几乎完全一样:之所以提供两个方法,是因为:
* 1,照顾习惯了jpa的用法
* 2,save返回主键值,persist返回null
* 3,save因为需要返回主键值,所以会立即生成insert语句
* persist则保证当它在一个事务外部被调用时,并不立即转换成insert这个是
* 非常有用的,尤其当我们封装一个长回话流程的时候。
*/
}
public void testLoad(){
Configuration cfg = new Configuration().configure();
SessionFactory sess = cfg.buildSessionFactory();
Session session = sess.openSession();
Transaction ts = session.beginTransaction();
News mynews = (News)session.load(News.class, new Integer(10)); //持久化状态
mynews.setTitle("陈超阳1");
mynews.setContent("河南平顶山人2");
// session.save(mynews); //多此一举,在session管理下的的对象,一旦修改了他的属性,在session的flush前会自动update到数据库中的
System.out.println(mynews.getTitle());
System.out.println(mynews.getContent());
session.flush();
ts.commit();
session.close();
sess.close();
/*get与load方法的区别:
* load方法和get方法主要区别在于是否延迟加载
* load方法具有延迟加载功能,当使用load方法时,不会立即访问数据库。当时图加载的对象不存在时
* load方法会返回一个代理,get方法会立即访问数据库,视图访问的对象不存在时返回null
*
* hibernate的处理流程:
* 从表面上看,上述程序有一个极大的性能缺陷,当我们需要修改一个持久化对象时需要
* 发送两条sql语句,一条用于查询指定记录的select语句,另一个用于修改该记录的update语句,但是
* 实际应用中无须考虑这种性能的缺陷:对于一个javaee应用而言:hibernate的处理流程通常是这样的:
* 从数据库里加载记录->将信息发送到表现层供用户修改,->
* 将所做修改重新保存到数据库里,这种流程下应用本省就需要发送两条sql语句
*/
}
//update没有作用????
public void testUpdate(){
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session1 = sessionFactory.openSession();
News news = (News)session1.get(News.class, new Integer(10));
session1.close();
news.setTitle("yangui");
news.setContent("tangjunshan");
Session session2 = sessionFactory.openSession();
session2.update(news);
session2.flush();
session2.close();
}
}