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

Maj*_*imi 0 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();
Run Code Online (Sandbox Code Playgroud)

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

Boz*_*zho 5

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

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

你需要打电话 session.delete(user)

  • 只是为了挑剔:如果用OneToOne(orphanRemoval = true)注释,则将字段设置为null会删除该对象 (2认同)