Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grails / GORM, Disable First-level Cache

Suppose I have the following Domain class mapping to a legacy table, utilizing read-only second-level cache, and having a transient field:

class DomainObject {
 static def transients = ['userId']

 Long id
 Long userId

 static mapping = {
  cache usage: 'read-only'
  table 'SOME_TABLE'
 }
}

I have a problem, references to DomainObject are being shared due to first-level caching, and thus transient fields are writing over each other. For example,

def r1 = DomainObject.get(1)
r1.userId = 22

def r2 = DomainObject.get(1)
r2.userId = 34

assert r1.userId == 34

That is, r1 and r2 are references to the same instance. This is undesirable, I would like to cache the table data without sharing references. Any ideas?

[Edit]

Understanding the situation better now, I believe my question boils down to the following: Is there anyway to disable first level cache for a specific domain class while still using second level cache?

[Edit]

Since there appears to be no clean way to obtain this objective, we've opted instead to redesign around the need for it.

like image 891
Stephen Swensen Avatar asked May 23 '26 17:05

Stephen Swensen


1 Answers

Please ignore my previous answer, I didn't understand fully your issue.

However, the following will work (code tested) :

def r1 = DomainObject.get(1)
r1.userId = 22
r1.discard() //BE CAREFUL WITH THIS, YOU MIGHT END UP WITH a LazyInitializationException

def r2 = DomainObject.get(1)
r2.userId = 34

assert r1.userId == 22
like image 128
fabien7474 Avatar answered May 25 '26 05:05

fabien7474



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!