使用域类作为持久性和瞬态?

时间:2013-01-21 02:02:27

标签: grails grails-domain-class transient

我正在实施一个交易系统,我想在实时交易和回测中使用相同的代码。在进行实时交易时,我需要坚持发生的所有事情,但在回测时,我想使用相同的类和逻辑,但不要坚持它们(为了速度,因为我没有理由存储它们。)

我以为我可以通过不对它们调用save()来做到这一点,但我遇到了一个问题。我有一个Account类,其中包含一个hasMany Position对象集合。麻烦的是我需要在帐户中找到正确的位置,但似乎我不能,因为它从未被保存过。我尝试迭代hasMany Positions的集合,但是那里没有任何内容,即使我构造了一个Position对象并使用addToPositions()将其添加到帐户中。我想这才有意义,直到调用save()后我才想避免。

有没有办法为持久性和瞬态目的重用相同的类,或者我是否尝试犯下不自然的行为?我对如何在两种情况下重用这些类的任何建议持开放态度。

更新(添加代码示例):

Account.groovy:

class Account {
    String name
    static belongsTo = [user:S2User]
    static hasMany = [positions:Position, transactions:Transaction]
}

SimAccount.groovy:

class SimAccount extends Account {
}

Position.groovy:

class Position implements Serializable {
    String symbol
    static belongsTo = [account:Account]
}

BacktestController.groovy:

        // add Account
        def acct = new SimAccount(name:"backtest")
        // add position
        def pos = new Position(symbol:'SIRI')
        acct.addToPositions(pos)

Strategy.groovy:

    println "apply($accounts, $quotes) [$name]"
    accounts.each{ a ->
        println "  acct $a (${a?.name})"
        a?.positions?.each{ p ->
            println "    pos: $p"
        }
    }

    def siri = Position.findByAccountAndSymbol(accounts[0], 'SIRI')
    println "siri pos: $siri"

保存对象时,Strategy.groovy的输出是

apply([com.lossless.account.SimAccount : 1, null], [:]) [Live SIRI 50k]
  acct com.lossless.account.SimAccount : 1 (sim1)
    pos: com.lossless.account.Position : 1
  acct null (null)
siri pos: com.lossless.account.Position : 1

未保存对象时的输出是

apply([com.lossless.account.SimAccount : null, null], [bid:1.74, ask:1.74]) [Backtest SIRI 50k]
  acct com.lossless.account.SimAccount : null (backtest)
    pos: com.lossless.account.Position : null
  acct null (null)
| Error 2013-01-21 03:11:11,984 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver  - TransientObjectException occurred when processing request: [POST] /lossless/backtest/index - parameters:
object references an unsaved transient instance - save the transient instance before flushing: com.lossless.account.Account. Stacktrace follows:
Message: object references an unsaved transient instance - save the transient instance before flushing: com.lossless.account.Account
   Line | Method
->> 105 | doCall         in org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    66 | apply          in com.lossless.Strategy

Strategy.groovy中的第66行是对Position.findByAccountAndSymbol()的调用。

0 个答案:

没有答案