将持久对象设置为NULL是否在Hibernate中删除它

时间:2011-11-06 10:02:54

标签: java hibernate

考虑这个例子:(User是一个包含两个字段的类:生成的id和用户名)

User user = new User();
user.setUserName("username");

SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory();
Session session = sessionfactory.openSession();

session.beginTransaction();
session.save(user);
user = null; // Does this deletes the object?
session.getTransaction().commit();

session.close();

因为user是持久对象,为什么将其设置为null不会从DB中删除对象?

1 个答案:

答案 0 :(得分:5)

不,它没有。将局部变量设置为null意味着该方法之外没有任何内容。 Hibernate不知道你已经使你的局部变量无效(即使它是一个不是由hibernate管理的字段,hibernate仍然不可能检测到变化)。

原因是变量和字段只是对象的引用,而不是对象本身。因此,当您使引用为空时,这并不意味着该对象不再存在。在这种情况下,它仍然存在于hibernate会话中。 (正如JB Nizet所指出的,如果拥有该字段的对象由hibernate管理,则hibernate可以检测到更改并删除该对象,但这仅适用于hibernate管理的对象:附加实体)

您需要致电session.delete(user)