spring-data-jpa: найдены общие ссылки на коллекцию org.hibernate.HibernateException - PullRequest
0 голосов
/ 07 апреля 2020

Я знаю, что этот вопрос задают и отвечают несколько раз, а также имеет обходной путь

, как в Найдены общие ссылки на коллекцию org.hibernate.HibernateException http://www.java2s.com/Questions_And_Answers/JPA/Collection/HibernateException.htm

, но ничего из вышеперечисленного не сработало для меня.

Я использую SpringBoot, JPA, Hibernate и у меня есть отображение, как указано ниже.

Я получаю список Телефон и итерации по нему, используя для l oop. Я получаю сообщение об ошибке Found shared references to a collection: Phone.person при переборе списка телефонов

org.hibernate.HibernateException: Found shared references to a collection: Phone.person
    at org.hibernate.engine.internal.Collections.processReachableCollection(Collections.java:188) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.FlushVisitor.processCollection(FlushVisitor.java:50) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:104) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:65) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:59) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:182) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:232) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:92) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]

Отображение на Phone сущность

@Entity
@Table(name = "PHONETABLE")
@Data
public class Phone{

// other column mapping

    @ManyToMany
    @JoinTable(name = "SomeTable", joinColumns = {
            @JoinColumn(name = "column1", referencedColumnName = "personColumn") }, inverseJoinColumns = {
                    @JoinColumn(name = "id", referencedColumnName = "id", unique = true) })
    @JsonIgnore
    private Set<Person> person;

}

Я звоню на findByIdMethod, чтобы получить данные из репозиторий. Я использовал lombok, потому что геттеры - сеттеры.

Если кто-нибудь знает решение, то было бы здорово. Спасибо;

1 Ответ

0 голосов
/ 07 апреля 2020

Похоже, у вас есть несколько экземпляров Phone с одним и тем же экземпляром Set для person. Это может произойти, когда вы клонируете или копируете Phone, или делаете что-то вроде phone1.setPerson(phone2.getPerson()).

Это нормально, что Person s одинаковы, но не сам Set. Каждый телефон должен создать новый экземпляр Set, который используется только внутри сущности.

В этом можно убедиться, создавая экземпляры коллекций в конструкторе или непосредственно после объявления, а затем никогда не вызывая метод установки для коллекция, например

private Set<Person> person = new HashSet<Person>();

void addPerson(Person person) {
    this.person.add(person);
}

и использовать только addPerson, но не setPerson (вы можете добавить аналогичные вспомогательные методы для добавления нескольких людей или удаления человека и т. д. c.).

Вы также можете вернуть копию набора вместо самого набора в методе получения getPerson, чтобы быть уверенным, что экземпляр коллекции никогда не просочится.

...