2011-01-27 7 views
0

DaoレイヤをKodoJDOからHibernateに移植します。 私はデータベースにメニューを保持しており、ユーザーの権限に基づいて、ユーザーが実行できる権限だけを表示するためにローカルコピーをプルーニングします。JDO makeTransientのHibernateに相当するもの

私がKodoJDOでこれをやったとき、私はobjestを作らなければなりませんでした。私はdbに変更を書き戻したくないので一時的に剪定していました。

私はHibernateで同等の機能はありません。 1つはありますか?これらの変更がdbに書き戻されないようにするにはどうすればよいですか。

ここでは、枝刈り機能があります。

public void prune(Collection<Entitlement> ents) 
{ 
    Session session=PersistenceManager.getManager(); 
    // Rewrite---------------------------------- 
    //session.makeTransient(this); 

    for (Iterator<Leaf> iter = leafs.iterator(); iter.hasNext();) 
    { 
    Leaf l = (Leaf) iter.next(); 
    if(!l.isAllowed(ents)) 
    { 
    iter.remove(); 
    } 
    } 
    for (Iterator<Branch> iter = branches.iterator(); iter.hasNext();) 
    { 
    Branch b = (Branch) iter.next(); 
    if(b!= this) 
    { 
    b.prune(ents); 
    } 
    if (b.hasNoChildren()) 
    { 
    iter.remove(); 
    } 
    } 
} 

答えにコメントする。私は最も完成したものを受け入れましたが、スカフマンとアフィの答えは貴重でした。

+0

コードインデントskaffmanをありがとう。あなたは私が同じことをやっている途中だけだったのですが、提出しました。 – Aaron

答えて

1

JPA 2.0では、entityManager.detach(..)です。 JPAを使ってhibernateを使用することをお勧めしますので、私はJPAバージョンを明示しています。

私たちはHibernateのEntityManagerImplで実装detach(..)方法がどのように見れば、それはgetSession().evict(entity)

根本的なセッションでを使用しています。しかし、あなたはほとんどこれを実行する必要がない必要があることに注意してください。私はそれがJDOの一般的なプラクティスかどうかはわかりませんが、JPA/Hibernateでは、正しく使用している場合は必要ありません。

あなたのコメントによると、休止状態のエンティティを値を変更しても保持されないオブジェクトとして使用したい場合。私はそのようなものを使用していません。なぜなら私は通常、セッション/エンティティマネージャを開いていないからです。あるいは、私は値オブジェクトを使用します。ビューにオープンセッションがあり、値オブジェクトを持たない場合(yes)、これは有効な使用法です。

+0

「正しく使用する」とはどういう意味ですか?上のコードでは、私はライブで永続的なオブジェクトから始めています。そして、私は永続化したくない変更を行います。私は永続的なバージョンをテンプレートとして使用しています。それはそれらを適切に使用していますか? – Aaron

+0

@Aaron - まあ、私はそれを使ったことはありませんでしたが、私の今後のアップデートを見てください。 – Bozho

2

evict(Object object)は、お探しのインターフェイスSessionのメソッドです。

また、ボキャブラリは休止状態では少し異なります。セッションごとにjavadoc:

transient: never persistent, not associated with any Session 
persistent: associated with a unique Session 
detached: previously persistent, not associated with any Session 

したがって、一時的なことは全く同じことを意味しません。 「分離された」とは、あなたが話していることのために使う言葉です。

0

Session.evict(entity)はおそらくhas the semanticsあなたが探している:

はセッションキャッシュからこのインスタンスを削除してください。インスタンスの変更はデータベースと同期されません。

関連する問題