1

Mongo によってサポートされている Grails ドメイン オブジェクトを保存しようとすると、すべての埋め込みオブジェクトもsave()それらを呼び出しています。場合によっては、これがパフォーマンスに多大な影響を与えています。

ドメイン オブジェクトの例を次に示します。

class Bird {
    Object Id
    String name
}

class Nest {
    static embedded = ['birds']

    String name
    Set<Bird> birds
}

class Tree {
    static embedded = ['nests']

    Object Id
    String name
}

class TreeState {
    static embedded = ['tree']

    Object Id
    Set<Nest> nests
    Tree tree
    Date dateCreated
}

ここで、特定の時点でのツリーの状態を保存したいとしましょう。

def tree = Tree.findByName("Sleepwood")

def nestA = new Nest()
nestA.birds = new LinkedHashSet()
nestA.name = "Sleepwood-A"

def nestB = new Nest()
nestB.birds = new LinkedHashSet()
nestB.name = "Sleepwood-B"

def blueJay = Bird.findByName('Blue Jay')
def cardinal = Bird.findByName('Cardinal')
def oriole = Bird.findByName('Oriole')
def robin = Bird.findByName('Robin')

def treeState =  new TreeState()
treeState.nests =  new LinkedHashSet()
treeState.tree = tree

nestA.add(blueJay)
nestA.add(cardinal)
nestA.add(oriole)

nestB.add(oriole)
nestB.add(blueJay)
nestB.add(robin)

treeState.nests.add(nestA)
treeState.nests.add(nestB)
treeState.safe(failOnError: true)

この種のアクションは、埋め込まれたエンティティを引き起こし、BirdTreeとして保存されるだけでなく、関連するドメイン モデルを更新するためにも保存されるようです。

これらの参照の更新を禁止し、埋め込みフィールドをTreeStateオブジェクトに保存する方法はありますか?

4

0 に答える 0