首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spring-data-jpa :找到对集合org.hibernate.HibernateException的共享引用

spring-data-jpa :找到对集合org.hibernate.HibernateException的共享引用
EN

Stack Overflow用户
提问于 2020-04-07 17:54:13
回答 1查看 680关注 0票数 0

我知道这个问题被问了很多次,也有一个变通的办法。

就像在Found shared references to a collection org.hibernate.HibernateException http://www.java2s.com/Questions_And_Answers/JPA/Collection/HibernateException.htm中一样

但是以上这些对我来说都不起作用。

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

我正在检索电话列表,并使用for循环对其进行迭代。我在迭代电话列表时收到错误Found shared references to a collection: Phone.person

代码语言:javascript
运行
复制
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实体

代码语言:javascript
运行
复制
@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,因为getters是setter。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-07 18:15:06

看起来您有多个Phone实例,并且具有相同的person Set实例。当您克隆或复制Phone,或者执行类似phone1.setPerson(phone2.getPerson())的操作时,可能会发生这种情况。

Persons相同是可以的,但Set本身不一样。每个电话都应该创建一个仅在实体内使用的Set的新实例。

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

代码语言:javascript
运行
复制
private Set<Person> person = new HashSet<Person>();

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

并且只能使用addPerson,而不能使用setPerson (您可以添加类似的助手方法来添加多个person,或者删除一个person等)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61077311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档