2016-04-05 16 views
0

私は、IDを除いてデータベースに重複レコードを許可しています。レコードが更新されると、重複を見つけて更新する必要があります。私は研究を通して、HibernateのイベントメソッドbeforeUpdateとafterUpdateを見つけました。grailsで重複レコードを更新する方法

ERROR:行を更新または削除別のトランザクションによって(または保存されていないと値のマッピングが間違っていました)た

ここでは私のafterUpdateある問題は、私が重複するものを見つけ、それらを介して繰り返しを開始したときに、私はこのエラーを取得するということですドメイン内のコード:エラーがライン19上にある

1  def afterUpdate() { 
2   println "\n*** afterUpdate ***" 
3   def record = this 
4 
5   DomainObject.createCriteria().list() { 
6    ne('id', record.id) 
7    or { 
8     eq('storeId', record.storeId) 
9     and { 
10      eq('firstName', record.firstName) 
11      eq('lastName', record.lastName) 
12      eq('dateOfBirth', record.dateOfBirth) 
13     } 
14    } 
15    //eq('lastUpdated', record.lastUpdated) 
16   }.each { dupe -> 
17    log.info "syncing ${dupe.id} with ${record.id}" 
18    dupe.properties.each{ key, value -> 
19     println "*** prop: ${key}: ${value}" 
20    } 
21   } 
22  } 
23 

我々はGrailsの2.4.4を使用し、Windows

答えて

2

に開発しているdocumentationを見てみましょう。 withNewSessionの使用については、このセクションに注意を払う:

class Person { 
    String name 
    def beforeDelete() { 
     ActivityTrace.withNewSession { 
     new ActivityTrace(eventName: "Person Deleted", data: name).save() 
     } 
    } 
} 

Notice the usage of withNewSession method above. Since events are triggered whilst Hibernate is flushing using persistence methods like save() and delete() won't result in objects being saved unless you run your operations with a new Session.

Fortunately the withNewSession method lets you share the same transactional JDBC connection even though you're using a different underlying Session.

+0

クラップ、私は.withNewSession部分を見逃している必要があります!ジョシュアありがとう! – havoc74