如何删除JPA中未分配的实体?

如何删除JPA中未分配的实体?,jpa,entitymanager,Jpa,Entitymanager,我有一个数据库,包括像标记和项目这样的实体。一个项目可能有多个标签,一个标签可以分配给多个项目,因此@ManyToMany关系: @Entity @Table(name="items") public class Item { ...other fields... @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "items_tags", joinColumns = @JoinColumn(name = "

我有一个数据库,包括像标记和项目这样的实体。一个项目可能有多个标签,一个标签可以分配给多个项目,因此@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<>();

}
@实体
@表(name=“items”)
公共类项目{
……其他领域。。。
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“items\u tags”,joinColumns=@JoinColumn(name=“item”,referencedColumnName=“id”),inverseJoinColumns=@JoinColumn(name=“tag”,referencedColumnName=“id”))
private List tags=new ArrayList();
}
我试图做的是从.xhtml页面上基于数据库的相应复选框选择中删除标记。我尝试的第一种方法是:

public void deleteTags(List<Tag> selectedTags) {
    for (Tag tag : selectedTags) {
        em.remove(em.merge(tag));
        }
    }
public void delete标签(列出所选标签){
用于(标记标记:选定标记){
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));
                }
            }
       }
 }
@EJB
私人物品服务是;
@持久上下文
私人实体管理者;
东西
公共作废删除标记(列出选定标记){
列表项=is.getItems();
用于(标记标记:选定标记){
用于(项目i:项目){
if(i.getTags().contains(tag)){
//做一些弹出窗口
}否则{
em.remove(em.merge(tag));
}
}
}
}

但是,它也不起作用。有什么办法解决这个问题吗?

为什么
如果。。。否则…
条件?您希望删除
标记
,而不管
项是否使用它。请尝试以下代码:

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);
}

我似乎没有findByTag方法,它应该是什么样子的?我想它应该是一个执行查询的方法,比如
SELECT I FROM Item I其中:tag MEMBER OF I.tags
。您还可以添加一个
joinfetchi.tags
子句来优化查询