Supposons que je donne les résultats suivants mappage de classe de domaine à une table d'héritage, en utilisant lecture seule cache de second niveau, et ayant un champ transitoire:Grails/GORM, Désactiver premier niveau Cache
class DomainObject {
static def transients = ['userId']
Long id
Long userId
static mapping = {
cache usage: 'read-only'
table 'SOME_TABLE'
}
}
J'ai problème, les références à DomainObject sont partagées en raison de la mise en cache de premier niveau, et donc les champs transitoires s'écrivent les uns sur les autres. Par exemple,
def r1 = DomainObject.get(1)
r1.userId = 22
def r2 = DomainObject.get(1)
r2.userId = 34
assert r1.userId == 34
Autrement dit, r1 et r2 sont des références à la même instance. Ce n'est pas souhaitable, je voudrais mettre en cache les données de la table sans partager de références. Des idées?
[Modifier]
Comprendre la situation mieux maintenant, je pense que ma question se résume à ce qui suit: Y at-il de toute façon à désactiver la première cache de niveau pour une classe de domaine spécifique tout en utilisant cache de second niveau?
[Modifier]
Comme il semble y avoir aucun moyen propre pour atteindre cet objectif, nous avons plutôt opté pour redessiner autour de la nécessité.
Merci. Bien que cela fonctionne pour mon exemple simple, ce n'est pas une approche pratique à prendre tout au long de l'application. Je suis surpris: p.266 et p.276 dans Definitive Guide To Grails reconnaissent la réutilisation d'instance comme faisant partie du cache de premier niveau mais ne considèrent pas le scénario que j'ai présenté. Je me demande s'il existe un moyen de désactiver le cache de premier niveau pour un objet de domaine spécifique, c'est peut-être le problème et le cache de second niveau fonctionnera comme je le souhaite. –
Je ne vous connais pas toutes les exigences donc je ne peux pas vraiment aider sauf de ma réponse pour ce petit exemple. Cela dit, même l'exemple me semble étrange ... – fabien7474
L'idée ici peut être comparée à un multi-ensemble qui est augmenté (via des champs transitoires) et transformé en un ensemble normal: par ex. [pomme, pomme, orange, orange] -> [pomme ', pomme' ', pomme' '', orange ', orange' '] –