Блокировка @Transactional метод - PullRequest
       7

Блокировка @Transactional метод

0 голосов
/ 28 сентября 2018

У меня проблема с добавлением некоторых объектов в базу данных.У меня есть пользовательский объект, который содержит объект @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;
}

Затем я хочу вернуть разговоры пользователя после создания, чтобы у него были текущие данные на стороне клиента.Кажется, все в порядке, запись в консоли данных о разговоре и о пользователе - это все, все идентификаторы также, они не равны 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]
...