考虑这个例子:(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中删除对象?
答案 0 :(得分:5)
不,它没有。将局部变量设置为null
意味着该方法之外没有任何内容。 Hibernate不知道你已经使你的局部变量无效(即使它是一个不是由hibernate管理的字段,hibernate仍然不可能检测到变化)。
原因是变量和字段只是对象的引用,而不是对象本身。因此,当您使引用为空时,这并不意味着该对象不再存在。在这种情况下,它仍然存在于hibernate会话中。 (正如JB Nizet所指出的,如果拥有该字段的对象由hibernate管理,则hibernate可以检测到更改并删除该对象,但这仅适用于hibernate管理的对象:附加实体)
您需要致电session.delete(user)