Я пытаюсь сохранить информацию о пользователе, а также информацию о его любимой команде.Он может изменить свою любимую команду в любое время.Пользователь может иметь несколько свойств, среди которых он может иметь несколько любимых команд.
Таким образом, я создал класс 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();
}
Я знаю, что мой подход неверен, но как обходной путь, я использовал этот подход.Если у кого-то есть хороший подход, пожалуйста, поделитесь.А также у меня возникает проблема, когда я удаляю пользователя, удаляется соответствующая его любимая команда в таблице любимых команд, чего я не хочу.Я хочу удалить конкретную команду из набора или таблицы поиска.
Заранее спасибо