既存のアプリケーションの一部として、Grails に単純なチャット システムを実装しています。
考慮すべき主なクラスは次のとおりです。
ユーザー.groovy
class User {
...
static hasMany = [
...
chatMessages : ChatMessage,
conversationParticipations:ConversationParticipation
]
static constraints = {
...
}
}
ChatConversation.groovy
class ChatConversation {
static hasMany = [
conversationParticipations:ConversationParticipation,
chatMessages:ChatMessage
]
static constraints = {
}
}
ConversationParticipation.groovy - User と ChatConversation の間の多対多を削除するための中間クラス
class ConversationParticipation {
ChatMessageBuffer chatMessageBuffer
static constraints = {
chatMessageBuffer nullable : true
}
static belongsTo = [
user:User,
chatConversation:ChatConversation
]
}
ChatMessageBuffer.groovy - 会話参加者がまだ読んでいないチャット メッセージを保持するために使用されます
class ChatMessageBuffer {
static hasMany = [
chatMessages : ChatMessage
]
static belongsTo = [
conversationParticipation:ConversationParticipation
]
static constraints = {
chatMessages nullable : true
conversationParticipation nullable : true
}
}
サービスでは、メソッドを呼び出して会話を作成し、送信されたメッセージをその会話の ChatMessageBuffers に次のように送信しています
def createChatConversation(chatDetails)
{
def chatConversation = new ChatConversation()
chatConversation.save(flush:true, failOnError:true)
new ConversationParticipation(
user:getCurrentUser(),
chatConversation:chatConversation,
chatMessageBuffer:new ChatMessageBuffer()
).save(flush:true, failOnError:true)
new ConversationParticipation(
user:User.get(chatDetails.id),
chatConversation:chatConversation,
chatMessageBuffer: new ChatMessageBuffer()
).save(flush:true, failOnError:true)
return chatConversation
}
def sendMessage(chatMessageDetails)
{
//save the message
def chatMessage = new ChatMessage(
body:chatMessageDetails.chatMessage,
dateSent: new Date(),
user:getCurrentUser(),
chatConversation:ChatConversation.get(chatMessageDetails.chatConversationId)
).save(flush:true,failOnError : true)
//add the message to the message buffer for each participant of the conversation.
ConversationParticipation.findAllByChatConversation(
ChatConversation.get(chatMessageDetails.chatConversationId)
).each {
if(it.chatMessageBuffer.addToChatMessages(chatMessage).save(flush:true, failOnError:true))
{
println"adding to ${it.chatMessageBuffer.id}"
println"added to : ${it.chatMessageBuffer.dump()}"
}
}
def chatMessageBuffer = ChatMessageBuffer.get(1)
println"service : message buffer ${chatMessageBuffer.id}: ${chatMessageBuffer.dump()}"
return chatMessage
}
ConversationParticipation
オブジェクトの作成でわかるようにChatMessageBuffer
、 で save を呼び出すとカスケード保存されるも作成していnew ConversationParticipation
ます。
私の問題は、ChatMessage
s を 2 つの s に追加するときです。1 つChatMessageBuffer
目ChatMessageBuffer
は保存されていませんが、2 つ目は保存されています。そのため、同じバッファーに別のバッファーを追加しようとするChatMessage
と、最初のバッファーは空ですが、2 番目のバッファーには以前に追加された ChatMessage が含まれています。
私がどこで間違っているのか誰にも分かりますか? 最初のものが保存/更新されないのはなぜですか?