1

既存のアプリケーションの一部として、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ます。

私の問題は、ChatMessages を 2 つの s に追加するときです。1 つChatMessageBufferChatMessageBufferは保存されていませんが、2 つ目は保存されています。そのため、同じバッファーに別のバッファーを追加しようとするChatMessageと、最初のバッファーは空ですが、2 番目のバッファーには以前に追加された ChatMessage が含まれています。

私がどこで間違っているのか誰にも分かりますか? 最初のものが保存/更新されないのはなぜですか?

4

0 に答える 0