Hibernate中Session的load()和get()方法如何使用,举列子说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate中Session的load()和get()方法如何使用,举列子说明相关的知识,希望对你有一定的参考价值。

10.3. 装载对象
如果你知道某个实例的持久化标识(identifier),你就可以使用Session的load()方法 来获取它。 load()的另一个参数是指定类的.class对象。 本方法会创建指定类的持久化实例,并从数据库加载其数据(state)。
Cat fritz = (Cat) sess.load(Cat.class, generatedId);// you need to wrap primitive identifiers
long id = 1234;
DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id) );
此外, 你可以把数据(state)加载到指定的对象实例上(覆盖掉该实例原来的数据)。
Cat cat = new DomesticCat();
// load pk's state into cat
sess.load( cat, new Long(pkId) );
Set kittens = cat.getKittens();
请注意如果没有匹配的数据库记录,load()方法可能抛出无法恢复的异常(unrecoverable exception)。 如果类的映射使用了代理(proxy),load()方法会返回一个未初始化的代理,直到你调用该代理的某方法时才会去访问数据库。 若你希望在某对象中创建一个指向另一个对象的关联,又不想在从数据库中装载该对象时同时装载相关联的那个对象,那么这种操作方式就用得上的了。 如果为相应类映射关系设置了batch-size, 那么使用这种操作方式允许多个对象被一批装载(因为返回的是代理,无需从数据库中抓取所有对象的数据)。
如果你不确定是否有匹配的行存在,应该使用get()方法,它会立刻访问数据库,如果没有对应的记录,会返回null。
Cat cat = (Cat) sess.get(Cat.class, id);
if (cat==null)
cat = new Cat();
sess.save(cat, id);

return cat;
你甚至可以选用某个LockMode,用SQL的SELECT ... FOR UPDATE装载对象。 请查阅API文档以获取更多信息。
Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE);
注意,任何关联的对象或者包含的集合都不会被以FOR UPDATE方式返回, 除非你指定了lock或者all作为关联(association)的级联风格(cascade style)。
任何时候都可以使用refresh()方法强迫装载对象和它的集合。如果你使用数据库触发器功能来处理对象的某些属性,这个方法就很有用了。
-------源于Hibernate中文参考手册追问

这段代码有错吗?有的话,怎么改正?
  public void testLoad()
  Session session = HibernateSessionFactory.getSession();
  Student stu = (Student) session.load(Student.class, "s001");
  Transaction tx = session.beginTransaction();
  tx.commit();
  HibernateSessionFactory.closeSession();
  System.out.println(stu.getSname());
  
 

追答

public void testLoad()
  Configuration cf= new Configuration().configure();
SessionFactory sessionFactory=cf.buildSessionFactory();
Session se=sessionFactory.openSession();
Student stu = (Student) session.load(Student.class, "s001");

se.close();
ystem.out.println(stu.getSname());

  

追问

Session session = null; Transaction tx = null;
try session=HibernateSessionFactory.getSession();
Student stu = (Student) session.load(Student.class, "s001");
tx = session.beginTransaction(); tx.commit(); System.out.println(stu.getSname());
catch(Exception e)e.printStackTrace(); tx.rollback();
finally HibernateSessionFactory.closeSession(); 这样就对了!

追答

就得到一个对象,不用开始事务和提交事务的。

参考技术A

1、定义一个实体类

2、根据主键获取数据记录

示例:

Users user = (Users)session.load(Users.class, userId);   //Users是实体类,userId是主键值
Users user = (Users)session.get(Users.class, userId);

参考技术B load()是首先访问缓存,如果没有则访问数据库,get()是直接访问数据库!本回答被提问者采纳

以上是关于Hibernate中Session的load()和get()方法如何使用,举列子说明的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中Session.get()方法和load()方法的详细比较

hibernate中session的get和load方法

Hibernate中Session之get和load方法的真正区别

Hibernate的Session的get()和load()方法区别

Hibernate中Session的load()和get()方法如何使用,举列子说明

Hibernate中get()和load()方法的区别