什么是session.load用于

时间:2013-07-12 06:00:38

标签: sql hibernate

会话的负载似乎没用,如果我需要创建一个pojo,为什么我需要使用load来创建一个不可调用的对象?

@Test
public void testTwoSession() {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Teacher t = (Teacher) session.load(Teacher.class, 2);
    System.out.println(t);
    session.getTransaction().commit();
    System.out.println(t);
}

在提交之前,对象将被打印,但是当提交会话时,打印操作将失败。现在我想知道为什么不使用get方法来获取Teacher对象。

2 个答案:

答案 0 :(得分:0)

load()方法主要用于您只需要对实体的引用,但实际上并不关心它的状态,例如当您只想将此实体附加到另一个实体时:

public void createMessageForSender(String text, String senderId) {
    Message message = new Message();
    message.setText(text);
    Sender sender = (Sender) session.load(Sender.class, senderId);
    message.setSender(sender);
    session.persist(message);
}

在上面的代码中,您需要一个Sender实体引用来创建新的Message实体,但您不关心它的状态,也不需要从数据库加载它。 load()因此很有用。

答案 1 :(得分:0)

session.load()”并非无用,在很多情况下它都是一种非常有效的操作。 “load”和“get”之间的区别在于“load”会创建一个所谓的“代理”,这是一个临时的hibernate对象。实际上没有读过DB。相反,“get”方法总是读取实际数据(如果它不存在则返回null)。

在您的场景中,它不会产生如此大的差异(load()get()都将读取对象),但想象一下您想要连续插入的场景。在这种情况下,您将使用“load()”执行“1次插入”,将“get()”执行“1次读取”+“1次插入”。