传智播客hibernate学习笔记(1) 2010-8-26

来源:互联网 发布:qq大盗盗号软件下载 编辑:程序博客网 时间:2024/05/18 02:33

1.实体类必须有一个无参的构造函数,因为反射会用到。

2.实体类不能加final,因为加上final它便不能被继承。影响懒加载功能。

3.如果JAVA对象中的某个属性不需要存储在数据库中,那么就不需要配置在映射文件里面。

 

4.private 构造函数(){

 

}

这样其他人就没办法new这个对象了。

5.static游离块。只有当虚拟机加载这个(注意不是对象)的时候,才会执行一次里面的代码。

6.load方法,只有在真正用到对象的时候才会去数据库查询,当session关闭时,用到这个对象会报错。

    Session session = null;
        session = HibernateSessionFactory.getSession();
        //User u1 = (User)session.get(User.class,1);
        User u = (User)session.load(User.class,1);

不会报错
        //System.out.println(u.getUsername());
        session.close();


会报错

       System.out.println(u.getUsername());

load会直接new一个对象,哪怕数据库中不存在。

 

7.瞬时,持久,脱管

User u2 = new User();
        u2.setUsername("a");

瞬时对象,自己new的,数据库中没有记录与之对应。

 

持久:数据库中有对象与之对应,与session有关联,关联session没有关闭。当持久化对象变化时,事务提交时,hibernate能检测到。

脱管(游离):数据库中有数据与之对应,但是没有session与之关联。被人遗弃的有名分的孩子。

 

        Session session = null;
        session = HibernateSessionFactory.getSession();
        Transaction t = session.getTransaction();
        t.begin();
        User u = new User();
        u.setPassword("abc");
        u.setUsername("jinlong");
        session.save(u);

         //这里就会执行添加的sql语句,但是如果没有t.commit的话,会回滚,刚添加的数据会被删除,数据库里的主键ID会+1.证明那条数据被删除。
        u.setUsername("changename");

        //因为修改了名字,因为他是持久化对象,所以会执行一条update更新语句。
        t.commit();

       
        session.close();

8.什么时候使用session.update();?

      当对象处于脱管对象的时候,应该使用session.update()语句。

      如下:

          Session session = null;
        session = HibernateSessionFactory.getSession();
        User u = (User)session.get(User.class, 1);
        session.close();
        Session session1 = null;
        session1 = HibernateSessionFactory.getSession();
        Transaction t = session1.getTransaction();
        u.setUsername("icanplay");
        t.begin();
        session1.update(u);
        t.commit();
        session1.close();

9.什么时候用saveorupdate?当你不知道这个对象是游离还是脱管对象的时候,用它吧。

Session session = null;
        session = HibernateSessionFactory.getSession();
        User u = (User)session.get(User.class, 1);
        session.close();
        Session session1 = null;
        session1 = HibernateSessionFactory.getSession();
        Transaction t = session1.getTransaction();
        u.setUsername("icanplayit!");
        t.begin();
        User u1 = new User();
        u1.setPassword("aaa");
        u1.setUsername("whatcanido");
        session1.saveOrUpdate(u1);
        //update游离对象,会报错
        //session1.update(u1);
        t.commit();
        session1.close();

        saveorupdate之后,你的对象会变成持久的,merge之后,你的对象还是脱管的。

        merge

Session session = null;
        session = HibernateSessionFactory.getSession();
        User u = (User)session.get(User.class, 1);
        session.close();
        Session session1 = null;
        session1 = HibernateSessionFactory.getSession();
        Transaction t = session1.getTransaction();
        u.setUsername("icanplayit!");
        t.begin();
        User u1 = new User();
        u1.setPassword("aaa");
        u1.setUsername("whatcanido");
        //会执行一条添加,一条更新
        session1.saveOrUpdate(u1);
        //因为merge之后是脱管的,所以只执行一条添加
        //session1.merge(u1);
        //update游离对象,会报错
        //session1.update(u1);
        //这句便可以测出是脱管还是持久对象
        u1.setUsername("完蛋了");
        t.commit();
        session1.close();

10.unsaved-value="-1"

这个属性用来判断一个对象是游离还是脱管。

原创粉丝点击