Коллекция элементов не сохраняется в базе данных после завершения транзакции - PullRequest
0 голосов
/ 25 октября 2019

У меня есть сущность UserRoot. UserRoot используется для доступа ко всем пользовательским модулям, включая @ElementCollection FriendsList.

, когда я пытаюсь добавить друга в список друзей, после вызова .persist и тестирования из метода, который, кажется, сохраняется у друга,Но я пытаюсь вызвать другую тестовую конечную точку, которая извлекает список и печатает его, и он говорит, что размер равен 0. Я должен пропустить какую-то простую команду при добавлении UserRoot в список друзей. какие-либо предложения? Я попытался объединить данные, я попытался сбросить данные, прежде чем сохранить их, но, похоже, ничего не работает. мне нужно переосмыслить метод, который я использую для добавления друзей?

Следует отметить, что так, как у меня было раньше - работа - список друзей содержал список отдельных идентификаторов из UserRoot, PublicIdentityкоторый на самом деле не был связан с UserRoot, но имел идентификатор, который соответствовал корню пользователя. JPA, похоже, понравился таким образом лучше, но это привело к необходимости искать базу данных в другой раз каждый раз, когда пользователь сделал запрос. Я пытаюсь найти способ обойти это.

это ошибка, которую я получаю при попытке сброса перед совершением:

[http-nio-8080-exec-1] DEBUG o.h.e.j.s.SqlExceptionHelper - could not execute statement [n/a] 
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '40' for key 'UK_th3hlgtbty5m4reql4gqugbc9'

package tech.jdevmin.web.jdevminweb.jpa.friends;

import lombok.Data;
import tech.jdevmin.web.jdevminweb.jpa.user.root.UserRoot;

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Entity
@Data
public class FriendsList implements Serializable {

    public static final long serialVersionUID = -3108516247756660434L;


    @Id
    @GeneratedValue
    private Long flID;

    @OneToOne
    private UserRoot userRoot;

    @ElementCollection
    private List<UserRoot> usersFriends;

    @GeneratedValue
    private long listId;




    public void addFriend(UserRoot userRoot) {
        usersFriends.add(userRoot);
    }

    public FriendsList(){
        usersFriends = new ArrayList<>();

    }

}


package tech.jdevmin.web.jdevminweb.jpa.user.root;

import lombok.Data;
import tech.jdevmin.web.jdevminweb.jpa.friends.FriendsList;
import tech.jdevmin.web.jdevminweb.jpa.user.notification.UserAlertModule;
import tech.jdevmin.web.jdevminweb.jpa.user.profile.PublicPost;

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Entity
@Data
public class UserRoot implements Serializable {

    @Id
    @GeneratedValue
    private long userRootId;

    @Column
    private String identity;

    @OneToOne(mappedBy = "userRoot")
    @JoinColumn
    private UserAccountDetails accountDetails;

    @OneToOne(mappedBy = "userRoot")
    @JoinColumn
    private FriendsList friendsList;

    @OneToOne(mappedBy = "userRoot")
    @JoinColumn
    private UserAlertModule userAlertModule;

    @ElementCollection
    private List<PublicPost> publicPosts;

    public UserRoot(){
        publicPosts = new ArrayList<>();
    }

    public PublicPost addPost(PublicPost publicPost) {
        publicPosts.add(publicPost);
        return publicPost;
    }


}



 @Override
    public void acceptFriendRequest(long id, UserRoot currentlyActiveUserRoot) {

        String currentlyActiveUserRootIdentity = currentlyActiveUserRoot.getIdentity();
        log.info("currentlyActiveUserRootIdentity = {}", currentlyActiveUserRootIdentity);
        log.info("alertId to accept is = {}", id);
        log.info("accepting friend request ....");

        UserAlert alert = userMessagingService.acknowledgeAlert(id);


        String usernameToAdd = alert.getFromUsername();
        log.info("username to add = {}", usernameToAdd);
        String pidToAdd = alert.getSubject();
        log.info("finding user in userRootRepository by username = {}", usernameToAdd);
        UserRoot friendToAdd = userAccountAccessService.accessAccount(usernameToAdd);


        log.info("geting friends list from friend to add");
        FriendsList friendsFriendsList = friendToAdd.getFriendsList();
        log.info("getting currently active user root , getting friends list");
        FriendsList currentlyActiveUsersFriendsList = currentlyActiveUserRoot.getFriendsList();

        // beginning transaction
        log.info("beginning first transaction -- add self to New Friends' Friends List >");
        entityManager.getTransaction().begin();
        log.info("adding current user to friends' friends list ....");
        friendsFriendsList.addFriend(currentlyActiveUserRoot);
        log.info("committing first transaction");
        entityManager.getTransaction().commit();

        log.info("beginning second transaction");
        entityManager.getTransaction().begin();


        log.info("adding friend to friends list");
        currentlyActiveUsersFriendsList.addFriend(friendToAdd);


        log.info("committing second transaction ....");
        entityManager.getTransaction().commit();


        log.info("second transaction successfully committed!");

        log.info("beginning test >");

        log.info("CURRENTLY ACTIVE USER ROOTS FRIENDS LIST CONTENTS: \n");
        String currentIdentity = currentlyActiveUsersFriendsList.getUserRoot().getIdentity();
        log.info("current identity: {}",currentIdentity);
        currentlyActiveUsersFriendsList.getUsersFriends().forEach(friend->
                System.out.println(friend.getIdentity()));

        String friendsIdentity = friendsFriendsList.getUserRoot().getIdentity();
        log.info("friends identity = {}",friendsIdentity);
        friendsFriendsList.getUsersFriends().forEach(friend->
                System.out.println(friend.getIdentity()));

        log.info("test complete");
        log.info("accept friend request complete! returning ....");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...