我知道这个问题已被问及回答过多次,并且也有解决方法


Found shared references to a collection org.hibernate.HibernateException
http://www.java2s.com/Questions_And_Answers/JPA/Collection/HibernateException.htm

但是以上都不对我有用。

我正在使用SpringBoot, JPA, Hibernate
并具有以下提供的映射。

我正在检索Phone列表,并使用for循环遍历它。
遍历电话列表时出现错误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来获取吸气剂。

如果有人知道解决方案,那就太好了。
谢谢;

最佳答案

看来您有多个Phone实例,而Set的实例相同。当您克隆或复制person或执行类似Phone的操作时,可能会发生这种情况。

phone1.setPerson(phone2.getPerson())可以相同,但Person本身可以。每个电话都应创建一个Set的新实例,该实例仅在实体中使用。

您可以通过在构造函数中实例化集合或在声明之后直接实例化集合,然后再不调用集合的setter来确保这一点,例如

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

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


并且仅使用Set,而不使用addPerson(您可以添加类似的助手方法来添加多个人员,或删除一个人员等)。

您还可以在setPerson getter中返回集合的副本,而不是集合本身,以确保集合实例不会泄漏出去。

10-05 23:08
查看更多