会话的负载似乎没用,如果我需要创建一个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对象。
答案 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次插入”。