定向@ManyToMany但我喜欢一方返回不可修改(readonly)集

时间:2014-06-23 12:54:37

标签: java hibernate-mapping

我想不出更好的问题,如果我错了,请纠正我。

我需要实体:A和AGroup(在DB中,它们通过第3个表关联连接)

A.java

[...]
    @ManyToMany(mappedBy = "As")
    private Set<AGroup> AsGroup = new HashSet<AGroup>();
[...]

AGroup.java

[...]
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.EAGER)
    @JoinTable(schema = "ars", name = "a_group_rel",
            joinColumns = { @JoinColumn(name = "group_id") },
            inverseJoinColumns = { @JoinColumn(name = "a_id") })
    private Set<A> As= new HashSet<A>();
[..]

Ofc认为那不是我想要完成的工作。

AGroup.java 中,我也有一些想法:

 public void addA(A a) {
        if (a == null) {
            return;
        }

        if (!As.contains(a)) {
            As.add(a);
        }

        if (!a.getAsGroup().contains(this)) {
            a.getAsGroup().add(this);
        }
    }

    public void removeA(A a) {
        as = new HashSet<A>(As);
        as.remove(A);
        a.getAsGroup().remove(this);
    }

    public Set<A> getAs() {
        return Collections.unmodifiableSet(As);
    }

这也有效。现在您可以看到我从 A组方法中添加了 A 中的Set。现在我想在 A 中对AsGroup加上READONLY限制,例如添加 A

public Set<AGroup> getAsGroup() {
    return Collections.unmodifiableSet(AsGroup);
}

但是当我这样做时(出于显而易见的原因), AGroup addAremoveA)中的方法将无效。如何阻止来自所有来源的 A 中的修改,以及 AGroup 中的方法?我想在我的集合中添加/删除实体,但只能从一个方向添加/删除实体。在 A 中,我只想查看AsGroup中的实体。

1 个答案:

答案 0 :(得分:0)

你可能有:

boolean addA(A a) {
    return AsGroup.add(a);
}

boolean removeA(A a) {
    return AsGroup.remove(a);
}

然后这个方法只能在这个包中访问。如果你有适当的类分发包,那么这个解决方案应该没问题。