Как удалить один объект из списка объектов в сопоставлении Hibernate «один-ко-многим» с помощью API Criteria? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь сохранить информацию о пользователе, а также информацию о его любимой команде.Он может изменить свою любимую команду в любое время.Пользователь может иметь несколько свойств, среди которых он может иметь несколько любимых команд.

Таким образом, я создал класс UserEntity с набором классов FavoriteTeam следующим образом (что, очевидно, является отображением один ко многим)

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="LookupTable",
joinColumns=@JoinColumn(name="userID", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="favTeamId", referencedColumnName="teamId",unique=true))
private Set<FavouriteTeamEntity> favouriteTeamEntities;

Когда кто-то добавляет новую любимую командуработает нормально.Но проблема возникает, когда кто-то удаляет команду из своего списка.В настоящее время я придерживаюсь этого подхода, когда я удаляю весь пользовательский объект вместе с его дочерним объектом и снова вставляю все детали, кроме удаленной любимой команды из набора.

    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
    CriteriaQuery<UserEntity> criteriaQuery = criteriaBuilder.createQuery(UserEntity.class);
    Root<UserEntity> sRoot = criteriaQuery.from(UserEntity.class);
    criteriaQuery.select(sRoot);    
    criteriaQuery.where(criteriaBuilder.equal(sRoot.get("id"),userID));
    UserEntity i = session.createQuery(criteriaQuery).uniqueResult();

    UserBean userBean = new UserBean();
    userBean.setEmail(i.getEmail());
    userBean.setId(i.getId());
    userBean.setName(i.getName());

    Set<FavouriteTeam> fSet= new HashSet<>();
    i.getFavouriteTeamEntities().forEach((x) -> {
        FavouriteTeam fTeam = new FavouriteTeam();
        fTeam.setAltCityName(x.getAltCityName());
        fTeam.setCity(x.getCity());
        fTeam.setTeamId(x.getId());
        fTeam.setTricode(x.getTricode());
        fTeam.setFullName(x.getFullName());
        fSet.add(fTeam);
    });
    userBean.setFavouriteTeam(fSet);
    session.delete(i);
    tx.commit();

    Transaction tx1 = session.beginTransaction();
    UserEntity userEntity = new UserEntity();
    userEntity.setEmail(userBean.getEmail());
    userEntity.setId(userBean.getId());
    userEntity.setName(userBean.getName());
    session.persist(userEntity);
    tx1.commit();

    userBean.getFavouriteTeam().forEach((fff) -> {
        fff.setUserId(signIn.getId());
        if(String.valueOf(fff.getTeamId()).equals(teamId)) {
            continue;
        }else {
            this.insertTeamAsFavoriteTeam(fff);
        }

    });
    session.close();

Мой insertTeamAsFavoriteTeam выглядит следующим образом:

    public String insertTeamAsFavoriteTeam(FavouriteTeam favouriteTeam) {
    Session session = this.sessionFactory.openSession();
    UserEntity userEntity = (UserEntity) session.get(UserEntity.class, USER_ID);
    Transaction tx = session.beginTransaction();
    if (userEntity != null) {
        Set<FavouriteTeamEntity> lEntities = sEntity.getFavouriteTeamEntities();
        FavouriteTeamEntity favouriteTeamEntity = new FavouriteTeamEntity();
        favouriteTeamEntity.setId(favouriteTeam.getTeamId());
        favouriteTeamEntity.setAltCityName(favouriteTeam.getAltCityName());
        favouriteTeamEntity.setCity(favouriteTeam.getCity());
        favouriteTeamEntity.setFullName(favouriteTeam.getFullName());
        favouriteTeamEntity.setTricode(favouriteTeam.getTricode());
        lEntities.add(favouriteTeamEntity);
        userEntity.setFavouriteTeamEntities(lEntities);
    }
    session.save(userEntity);
    tx.commit();
    session.close();
}

Я знаю, что мой подход неверен, но как обходной путь, я использовал этот подход.Если у кого-то есть хороший подход, пожалуйста, поделитесь.А также у меня возникает проблема, когда я удаляю пользователя, удаляется соответствующая его любимая команда в таблице любимых команд, чего я не хочу.Я хочу удалить конкретную команду из набора или таблицы поиска.

Заранее спасибо

...