首页 > 解决方案 > @ManyToMany,使用视图

问题描述

我的实体“位置”上的 @ManyToMany 属性遇到问题。该位置包含与其他位置的父/子关系,因此它基本上表示位置树。(位置 A 包含子 A1、A2 和位置 A2 包含另一个位置 B 等)

没有火箭科学。

由于这是一个众所周知的“树”并且 Hibernate/JPA 不支持分层查询,我添加了一个只读的 ManyToMany 关系“allParents”。就像名字已经说过的那样,这个集合包含所有在树上向上的父母。为了实现这一点,我创建了一个在映射中用作可连接的视图。

同样在这里,没有火箭科学。一切正常。

请注意,我从不使用级联操作。

当我想删除位置时出现问题。此删除尝试删除该可连接中的记录(通常情况下确实如此),但这显然不适用于视图。(至少,不是我的观点)。

所以,我正在寻找一种方法来将此关联标记为只读。@Immutable 似乎没有完成这项工作。

(总是得到异常:org.postgresql.util.PSQLException:错误:无法从视图“allnamedparents”中删除)

谁能指出我正确的方向?

提前致谢!

@Entity
@Table(name = "location")
public class Location extends AbstractAuditingEntity implements {


    @OneToMany()
    @JoinColumn(name = "parent_id", foreignKey = @ForeignKey(name = "FK_location_parent"))
    private Set<AbstractLocation> childLocations = new LinkedHashSet<>();


    @Column(name="parent_id", updatable = false,insertable = false)
    private Long parentId;

    @Immutable()
    @ManyToMany()
    @JoinTable(
            name = "allnamedparents",
            joinColumns = {@JoinColumn(name = "locationid", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "parentid", referencedColumnName = "id")}
            )
    private List<AbstractLocation> allParents = new ArrayList<>();



}

标签: hibernatejpa-2.0

解决方案


推荐阅读