Hap*_*eer 7 collections jpa jpql
我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
RolePrivilege没有JPA对象,所以我不确定如何编写JPQL查询来从角色对象的privs字段中删除条目.例如,我试过这个,但它不起作用.它抱怨没有映射Role.privs.
DELETE FROM Role.privs p WHERE p.id=:privId
Run Code Online (Sandbox Code Playgroud)
我不知道还有什么可以尝试的.我当然可以编写一个从连接表RolePrivilege中删除的本机查询.但是,我担心这样做会与本地缓存的对象发生严重的交互,本地缓存的对象不会被本机查询更新.
是否甚至可以编写JPQL来删除连接表中的条目?如果不是,我可以只加载所有Role对象并从每个对象的privs集合中删除条目,然后保留每个角色.但是,如果一个简单的JPQL查询可以同时完成所有操作,那么这似乎很愚蠢.
JPQL 更新和删除语句需要引用实体名称,而不是表名称,所以我认为您对您建议的方法不走运。
根据您的 JPA 提供程序,您可以使用简单的原始 SQL 语句(应该 100% 可移植)从 JoinTable 中删除条目,然后以编程方式与缓存提供程序 API 交互以逐出数据。例如,在 Hibernate 中,您可以调用 evict() 来使二级缓存中的所有“Role.privs”集合过期:
sessionFactory.evictCollection("Role.privs", roleId); //evict a particular collection of privs
sessionFactory.evictCollection("Role.privs"); //evict all privs collections
Run Code Online (Sandbox Code Playgroud)
不幸的是,我对 JPA API 的使用还不够,无法确定到底支持什么。
| 归档时间: |
|
| 查看次数: |
8678 次 |
| 最近记录: |