阻塞@Transactional方法

时间:2018-09-28 10:09:01

标签: java spring hibernate jpa transactional

我在向数据库添加一些对象时遇到问题。我有一个包含@OneToOne对象的用户对象,该对象是一个消息框。有一个Set <Conversation>对象,其中包含对话列表。对话包含有关您自己和对象List<Message>的信息。该消息包含其他一些数据。我做了一个标记为@Transactional的方法,它“创建一条新消息”。我在其中执行适当的操作,然后将数据保存到上述对象。 我是这样做的:

@Transactional
public Set<Conversation> newMessage(MessageHelper messageHelper) {
    User sender = userRepository.getUserByUserName(messageHelper.getFrom());
    User receiver = userRepository.getUserByUserName(messageHelper.getTo());

    Conversation senderConversation = conversationRepository.getConversationWithUser(sender.getUsername(), receiver.getUsername());
    if(senderConversation == null)
        senderConversation = new Conversation(sender.getUsername(), receiver.getUsername());

    Conversation receiverConversation = conversationRepository.getConversationWithUser(receiver.getUsername(), sender.getUsername());
    if(receiverConversation == null)
        receiverConversation = new Conversation(receiver.getUsername(), sender.getUsername());

    Message message = messageHelper.getMessage();
    receiverConversation.getMessages().add(message);

    Message receiverMessage = new Message(message.getMessageFrom(), message.getMessage());
    receiverMessage.setWhenSent(message.getWhenSent());
    senderConversation.getMessages().add(receiverMessage);

    sender.getMessageBox().getConversationList().add(senderConversation);
    receiver.getMessageBox().getConversationList().add(receiverConversation);

    entityManager.persist(message);
    entityManager.persist(receiverMessage);

    entityManager.merge(sender);
    entityManager.merge(receiver);


    Set<Conversation> conversations = getConversations(sender.getUsername());
    System.out.println("Conv from service: " + conversations);
    System.out.println(userRepository.getUserByUserName(sender.getUsername()));
    // the application hangs here
    return conversations;
}

然后,我想在创建后返回用户的对话,以便它在客户端具有当前数据。一切似乎都没问题,在控制台中写入有关会话和用户的数据就是一切,所有id也是,它们都不为null,但不返回对象,方法挂起并且不抛出任何异常而不会引发异常。客户端应用程序正在等待服务器的响应,但是没有任何反应,服务器应用程序挂在这里。我在做什么错了?

在启用调试模式的日志中,将显示此类日志。跳过从数据库检索数据的日志:

2018-09-28 13:47:58.447 DEBUG 10476 --- [nio-8090-exec-1] org.hibernate.SQL                        : insert into message (is_readed, message, message_from, when_sent, id) values (?, ?, ?, ?, ?)
2018-09-28 13:47:58.449 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIT] - [false]
2018-09-28 13:47:58.450 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [aaaaaaa]
2018-09-28 13:47:58.450 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [VARCHAR] - [mati]
2018-09-28 13:47:58.451 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [TIMESTAMP] - [Fri Sep 28 13:47:57 CEST 2018]
2018-09-28 13:47:58.452 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [BIGINT] - [785]
2018-09-28 13:47:58.454 DEBUG 10476 --- [nio-8090-exec-1] org.hibernate.SQL                        : insert into message (is_readed, message, message_from, when_sent, id) values (?, ?, ?, ?, ?)
2018-09-28 13:47:58.455 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIT] - [false]
2018-09-28 13:47:58.455 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [aaaaaaa]
2018-09-28 13:47:58.455 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [VARCHAR] - [mati]
2018-09-28 13:47:58.455 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [TIMESTAMP] - [Fri Sep 28 13:47:57 CEST 2018]
2018-09-28 13:47:58.455 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [BIGINT] - [786]
2018-09-28 13:47:58.467 DEBUG 10476 --- [nio-8090-exec-1] org.hibernate.SQL                        : insert into message_box_conversation_list (message_box_id, conversation_list_id) values (?, ?)
2018-09-28 13:47:58.467 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [674]
2018-09-28 13:47:58.467 TRACE 10476 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [BIGINT] - [721]

0 个答案:

没有答案