@ManyToMany, используя вид - PullRequest
0 голосов
/ 04 января 2019

У меня проблемы со свойством @ManyToMany в моей сущности 'Location'. Местоположение содержит отношения родитель / потомок с другими местоположениями, поэтому оно в основном представляет собой дерево расположений. (Местоположение 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<>();



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...