2011-08-11 5 views
1

これはおそらくルーキーの間違いなので、事前に私を許してください。Grailsでオブジェクトを削除する際の問題 - 遅くてまだ実際には削除されていない

私は2つのドメインクラス、1つはドメインと呼ばれ、もう1つはページと呼ばれています。以下のコードが示すように、ドメインには多くのページがあります。

class Domain { 
      ... 
    static hasMany = [ pages : Page, ... ] 
    static mapping = { 
     pages lazy:true 
    } 
} 

class Page { 
    String identifier 
    ... 
    static belongsTo = [ domain : Domain ] 
    static hasMany = [ ... ] 
    static constraints = { 
     identifier(blank:false, unique:'domain') 
    } 
    static mapping = { 
     ... 
     domain lazy:true 
    } 
} 

私のアプリケーションには、とりわけ、ドメイン上のページが作成される長いアルゴリズムがあります。以前の実行と同じ引数を使用してアルゴリズムを実行すると、前の実行で作成されたすべてのページが削除され、アルゴリズムが再度実行されます。

私は2つの問題を抱えて:私は、ドメインから特定のページを削除すると

問題#1 を使用して:

def domain = page.domain 
domain.removeFromPages(page); 
page.delete() 
domain.save(flush:true) 

をこれが最終的に、ドメインのすべてのページをフェッチし、ロードするために休止状態を引き起こし数千のクエリが発生します(ドメインには多数のページがあります)。これでパフォーマンスをどのように改善できますか? - sqlを直接実行してページを削除すると、データベースと休止状態が同期しなくなります。

問題#2 私は後でもう一度ページを作成します。

def page = new Page(identifier:'...').save(failOnError:true) 

を私が取得:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 

すべてのヘルプは大歓迎です - 私はここに私の心を失っています: -/

答えて

0

バッチ削除についてはIntelliGrape

私は、リモート・システムに保存されている休日を取得して保存しなければならなかった、とそれぞれに私はローカルに保存されていたし、これは次のように思いついたものを削除フェッチ:

Holiday.list()*.delete(flush:true) 

すべての魔法が起こる場所*はあるが。 list()メソッドを使用して、削除するアイテムの数を制限することができます。

バッチでは、以下を使用してバッチを実行することもできます。

+0

こんにちは、Thxはレスポンスのためにたくさんあります。しかし、パフォーマンスの部分はバッチ削除の問題ではなく、関係の問題のほうが多く、他の回答が指摘したとおりです。しかし、戦争はまだ終わっていない。私はpage.delete(flush:true)を使ってページを削除していて、削除されたページをフェッチできない行の中でも、それは魔法のようにまだ存在します。後でページを作成したいときに、「org.springframework.orm.hibernate3.HibernateSystemException:同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられています」というメッセージが表示されるので、 – Krauw

1

私はあなたのクラスの小さな再設計について考えることをお勧めします。 まず、「ドメイン」から

Class Domain { 
    // no pages here 
} 

をページ-コレクションを削除し、これはあなたのページの取り扱いがはるかに容易になり、「ページ」で

Class Page {  
    String identifier 
    Domain domain 
    ... 
} 

を「ドメイン」への単純な参照を置きます。 既存のコードを変更する必要があるため、これが本当にオプションであるかどうかはわかりませんが、大規模なコレクションでは多くの問題を解決できます。これについてはpresentation by Burt Beckwithもあります。

+0

こんにちは。 。だから私はそれをただの関係で実装しました。そして、それは確かにページを削除するときに私のパフォーマンスの問題を押し上げました。私はまだ問題#2を持っています。私はpage.delete(flush:true)でページを削除しています。次の行にページを照会しようとすると、ヒットがゼロになります。しかしおそらく10行後、私はページを再度作成して、 "org.springframework.orm.hibernate3.HibernateSystemException:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられています"というようにします:-( – Krauw