Как удалить неназначенные объекты в JPA? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть база данных, включающая такие объекты, как Tag и Item.Один элемент может иметь много тегов, и один тег может быть назначен многим элементам, поэтому отношение @ManyToMany:

@Entity
@Table(name="items")
public class Item {

    ...other fields...

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "items_tags", joinColumns = @JoinColumn(name = "item", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "tag", referencedColumnName = "id"))
private List<Tag> tags = new ArrayList<>();

}

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

public void deleteTags(List<Tag> selectedTags) {
    for (Tag tag : selectedTags) {
        em.remove(em.merge(tag));
        }
    }

, который работает, только если все выбранные теги не были назначены ни одному элементу.В другом случае происходит сбой метода и ничего не удаляется, поэтому я попытался обойти это:

@EJB
private ItemsServices is;

@PersistenceContext
private EntityManager em;

...stuff...

public void deleteTags(List<Tag> selectedTags) {
    List<Item> items = is.getItems();

        for (Tag tag : selectedTags) {
            for (Item i : items) {
                if(i.getTags().contains(tag)) {
                    // Do some popup
                } else {
                   em.remove(em.merge(tag));
                }
            }
       }
 }

Но, ну, он тоже не работает.Есть идеи как это решить?

1 Ответ

0 голосов
/ 27 мая 2018

Почему условие if... else ...?Вы хотите удалить Tag независимо от того, используется он Item или нет.Попробуйте следующий код:

for (Tag tag : selectedTags) {
    Tag persistentTag = em.find(Tag.class, tag.getId());
    for (Item item : is.findByTag(persistentTag)) {
        item.getTags().remove(persistentTag);
    }
    em.remove(persistentTag);
}
...