0

2 つのドメイン クラスがあります。それらの最初は、ユーザーの名前と電子メールアドレス自体を含む電子メールアドレスを表します。もう 1 つのクラスは、件名、送信者 (1 つの電子メール アドレス)、および受信者 (電子メール アドレスのリスト) を含む電子メール メッセージを表します。

class EmailMessage {
    static hasMany = [ to: EmailAddress ]
    EmailAddress from
    String subject
}

class EmailAddress {
    String name
    String address
}

しかし、このコードは期待どおりに機能しません。

EmailMessage msg = new EmailMessage()
msg.from = new EmailAddress(name: "User 1", address: "user1@domain.com")
[new EmailAddress(name: "User 2", address: "user2@domain.com"), new EmailAddress(name: "User 3", address: "user3@domain.com")].each {
    msg.addToTo(it)
}
msg.subject = "Asunto"
msg.save(failOnError: true)

次のエラーが表示されます。

| Error 2013-08-14 21:08:40,362 [localhost-startStop-1] ERROR util.JDBCExceptionReporter  - La columna "FROM_ID" no permite valores nulos (NULL)
NULL not allowed for column "FROM_ID"; SQL statement: insert into email_message (id, version, from_id, subject) values (null, ?, ?, ?) [23502-164]
| Error 2013-08-14 21:08:40,375 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: could not insert: [prueba.EmailMessage];
SQL [insert into email_message (id, version, from_id, subject) values (null, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [prueba.EmailMessage]
Message: could not insert: [prueba.EmailMessage]; SQL [insert into email_message (id, version, from_id, subject) values (null, ?, ?, ?)]; constraint [null];
nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [prueba.EmailMessage]

これができるかどうか、またはカスケード保存が想定どおりに機能しないかどうかはわかりません。

各クラスで、hasMany、begsTo などのすべての組み合わせを試してみましたが、成功しませんでした。

私もこのトピックを読みましたが、Grails hasOne と hasMany 同じ domainが期待どおりに機能しません。

誰でも私を助けることができますか?よろしくお願いします。

4

2 に答える 2

1

残念ながらfrom、親を保存する前に自分を保存する必要があります。

EmailMessage msg = new EmailMessage()
msg.from = new EmailAddress(name: "User 1", address: "user1@domain.com")
if (!msg.from.save(flush: true)) {
    log.error("message could not be saved: " + msg.from.errors)
}
[new EmailAddress(name: "User 2", address: "user2@domain.com"), new EmailAddress(name: "User 3", address: "user3@domain.com")].each {
    msg.addToTo(it)
}
msg.subject = "Asunto"
msg.save(failOnError: true)

1:1 の関係ではカスケード セーブはありません。

于 2013-08-16T12:38:20.983 に答える
1

これは、標準メモリデータベースで機能します

class EmailMessage {
    static hasMany = [ to: EmailAddress ]
    EmailAddress from
    String subject

    static mapping = {
        from cascade: "save-update" //Pretty sure this is unnecessary
    }
}

class EmailAddress {
    String name
    String address

    static belongsTo = EmailMessage
}
于 2013-08-16T13:33:46.193 に答える