web-dev-qa-db-ja.com

Hibernate Session.delete()オブジェクトが存在する場合

SessionクラスのJavaDocでの delete メソッドの説明は次のとおりです。

データストアからpersistent instanceを削除します。引数は、受信セッションに関連付けられたインスタンス、または既存の永続状態に関連付けられた識別子を持つ一時的なインスタンスです。

私の質問は:

  1. デタッチオブジェクトを削除したいのですが、このメソッドを使用できますか?AFAIKセッションは、最初にオブジェクトをデタッチから永続化し、その操作を実行します。私は正しいですか?
  2. データベース内のオブジェクトの存在が不明な場合、Session.get()を使用してnullかどうかを確認してから削除操作を実行する必要がありますか、直接削除操作を使用できますか?

コードスニペットは次のとおりです。

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;
        }
    });
}

大丈夫ですか?

17
Tapas Bose

または、既存の永続状態に関連付けられた識別子を持つ一時インスタンス

これは、そのオブジェクトを削除するために、entitysession.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
_
27
Adeel Ansari
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();
        }

    }

}
7
Musaddique

より良い解決策を見つけました:

Query q = session.createQuery("delete Entity where id = X");
q.executeUpdate();

Hibernate Deleteクエリ

3
bluearrow

これを試して...

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
jsina

次のように単純な休止状態に従うことで簡単に達成できます。

Session session=getSession();  
String hql = "delete from Student where classId= :id"; 
session.createQuery(hql).setString("id", new Integer(id)).executeUpdate();
1

デタッチオブジェクトを削除したいのですが、このメソッドを使用できますか?AFAIKセッションは、最初にオブジェクトをデタッチから永続化し、その操作を実行します。私は正しいですか?

削除するオブジェクトの識別子がわかっている場合は、識別子を設定してインスタンスを作成し、セッション削除メソッドに渡すことができます。このインスタンスは、(識別子が関連付けられているため)切り離された状態にあると見なされますが、Hibernateによって内部的にセッションに再接続されてから削除されます。

データベース内のオブジェクトの存在が不明な場合、Session.get()を使用してnullかどうかを確認してから削除操作を実行する必要がありますか、直接削除操作を使用できますか?

削除するオブジェクトが見つからない場合、deleteメソッドはStaleObjectExceptionをスローします。そのため、例外処理を使用して、その場合の処理​​を決定できます。

1
Shailendra