在Session类的JavaDoc中,delete方法的描述是:
从数据存储中删除持久性实例。参数可以是与接收会话相关联的实例,也可以是具有与现有持久状态相关联的标识符的瞬态实例。
我的问题是:
以下是代码段:
public void removeUnallocatedUserIfExits(final long itemId) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
session.flush();
session.setCacheMode(CacheMode.IGNORE);
UnallocatedUser unallocatedUser;
if ((unallocatedUser = (UnallocatedUser) session.get(UnallocatedUser.class, itemId)) != null) {
session.delete(unallocatedUser);
}
session.flush();
return null;
}
});
}
好吗?
答案 0 :(得分:26)
或带有的瞬态实例 与现有关联的标识符 持久状态
这意味着您可以直接将entity
传递给session.delete()
,以便删除该对象。此外,您无需检查实体是否存在。如果在数据库中找不到记录,则应该有例外。事实上,我们通常不会真正得到这种情况。我们总是删除一个现有的实体,我的意思是通常的逻辑就是这样;所以,没必要那样做。你可以这样做,
SomeEntity ent = session.load(SomeEntity.class, '1234');
session.delete(ent);
或者你可以这样做,
SomeEntity ent = new SomeEntity('1234'); // used constructor for brevity
session.delete(ent);
顺便说一下,您也可以使用此版本session.delete(String query)
,
sess.delete("from Employee e where e.id = '1234'"); // Just found it is deprecated
答案 1 :(得分:6)
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class DeletePersistentObjectWithHibernate {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
long id = 2;
try {
session.beginTransaction();
Employee employee = (Employee) session.get(Employee.class, id);
session.delete(employee);
session.getTransaction().commit();
}
catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
}
答案 2 :(得分:3)
试试这个......
public <T> T delete(T t) throws Exception {
try {
t = load(t);
session.delete(t);
session.flush();
} catch (Exception e) {
throw e;
} finally {
session.clear();
}
return t;
}
public <T> T load(T t) {
session.buildLockRequest(LockOptions.NONE).lock(t);
return t;
}
答案 3 :(得分:3)
找到了一个更好的解决方案:
Query q = session.createQuery("delete Entity where id = X");
q.executeUpdate();
答案 4 :(得分:1)
我想删除一个分离对象,我可以使用这个方法,AFAIK会话 首先使一个对象从分离中持久化,然后执行它 操作。我是对的吗?
如果您知道要删除的对象的标识符,则可以创建一个设置了其标识符的实例,并将其传递给会话删除方法。此实例将被视为处于分离状态(因为存在关联的标识符),但是它将在内部通过Hibernate重新连接到会话,然后删除。
如果我不确定数据库中是否存在对象,应该 我使用Session.get()来检查它是否为null然后 执行删除操作还是我可以直接删除操作?
如果找不到要删除的对象,delete方法将抛出StaleObjectException。因此,您可以使用异常处理来决定在这种情况下要做什么。
答案 5 :(得分:1)
您可以通过以下简单的休眠方式轻松实现,
Session session=getSession();
String hql = "delete from Student where classId= :id";
session.createQuery(hql).setString("id", new Integer(id)).executeUpdate();
答案 6 :(得分:0)
休眠本地查询示例如下。
import org.hibernate.query.nativeQuery;
String sql = "Delete from Student where classId= :id";
NativeQuery query = session.createNativeQuery(sql.toString());
query.executeUpdate();