У меня проблемы со свойством @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<>();
}