Jpa 如何使用JPQL从联接表中删除条目?

Jpa 如何使用JPQL从联接表中删除条目?,jpa,collections,jpql,Jpa,Collections,Jpql,我有一个JPA对象,它具有如下多对多关系: @Entity public class Role { //... @ManyToMany(fetch=FetchType.EAGER) @JoinTable( name="RolePrivilege", joinColumns= @JoinColumn(name="role", referencedColumnName="ID"), inverseJoinColumns=

我有一个JPA对象,它具有如下多对多关系:

@Entity
public class Role {
    //...

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(
    name="RolePrivilege",
    joinColumns=
        @JoinColumn(name="role", referencedColumnName="ID"),
    inverseJoinColumns=
        @JoinColumn(name="privilege", referencedColumnName="ID")
    )
    private Set<Privilege> privs;
}
我不知道还能尝试什么。当然,我可以编写一个本机查询,从联接表RolePrivilege中删除。但是,我担心这样做会与本地缓存的对象产生不好的交互,而本地查询不会更新这些对象


甚至可以编写JPQL来从这样的联接表中删除条目吗?如果没有,我可以加载所有角色对象并从每个角色的privs集合中删除条目,然后持久化每个角色。但是,如果一个简单的JPQL查询可以同时完成所有操作,那么这样做似乎很愚蠢。

JPQL update和delete语句需要引用实体名,而不是表名,因此我认为您所建议的方法运气不佳

根据您的JPA提供程序,您可以使用简单的原始SQL语句(应该是100%可移植的)从JoinTable中删除条目,然后以编程方式与缓存提供程序API交互以逐出数据。例如,在Hibernate中,可以调用execute()使二级缓存中的所有“Role.privs”集合过期:

sessionFactory.evictCollection("Role.privs", roleId); //evict a particular collection of privs
sessionFactory.evictCollection("Role.privs"); //evict all privs collections

不幸的是,我对JPA API的使用还不够了解,无法确定到底支持什么。

Java是一种面向对象的语言,ORM的全部目的是向您隐藏连接表等的详细信息。因此,即使在不考虑后果的情况下考虑从联接表中删除,也会很奇怪

不,您不能使用JPQL,即实体


检索两端的实体并清除它们的集合。这将删除联接表条目。面向对象。

我也在寻找一种JPQL方法来删除多对多关系(包含在连接表中)。显然,ORM中没有表的概念,所以我们不能使用删除操作。。。但我希望有一个专门的接线员来处理这些案件。类似于链接和取消链接。也许是未来的特色

不管怎样,我一直在做的工作就是实现这个需求,使用实体bean中实现的集合,这些集合映射多对多关系

例如,如果我有一个与课程有多对多关系的班级学生:

@ManyToMany
private Collection <Courses> collCourses;
@manytomy
私人收藏课程;
我在实体中为该集合构建了一个getter和setter。然后,例如从EJB中,我使用getter检索集合,添加或删除所需课程,最后使用setter分配新集合。一切都结束了。它工作得很好

然而,我最担心的是性能。ORM应该保留所有对象的巨大缓存(如果我没有弄错的话),但即使使用它工作得更快,我想知道从集合中检索所有元素是否真的有效

因为对我来说,从表中检索注册表并使用纯Java而不是直接或间接地与内部DB引擎(SQL、JPQL…)一起工作的查询语言对其进行后期筛选是非常低效的

@ManyToMany
private Collection <Courses> collCourses;