Что приводит к ошибке "found shared references to a collection" в hibernate?

Пользователь

от gussie.jones , в категории: Java , год назад

Что приводит к ошибке "found shared references to a collection" в hibernate?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от velma , год назад

@gussie.jones 

Ошибка "found shared references to a collection" в Hibernate возникает, когда два объекта ссылаются на одну и ту же коллекцию в контексте сессии Hibernate.


Например, рассмотрим следующий код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// Получаем объект "User" из базы данных
User user = session.get(User.class, 1L);

// Получаем коллекцию "posts" пользователя
Collection<Post> posts = user.getPosts();

// Создаем новый объект "Post"
Post newPost = new Post();
newPost.setTitle("New Post");

// Добавляем новый объект "Post" в коллекцию "posts"
posts.add(newPost);

// Сохраняем объект "User" в базе данных
session.save(user);

// Сохраняем новый объект "Post" в базе данных
session.save(newPost);


В этом примере мы получаем объект "User" из базы данных и получаем коллекцию "posts" для этого пользователя. Затем мы создаем новый объект "Post" и добавляем его в коллекцию "posts". После этого мы сохраняем объект "User" и новый объект "Post" в базе данных.


Однако, если другой объект "User" или другой объект, который содержит коллекцию "posts", также был получен в этом контексте сессии Hibernate, то добавление нового объекта "Post" в коллекцию "posts" приведет к ошибке "found shared references to a collection".


Чтобы исправить эту ошибку, нужно убедиться, что каждый объект использует свою собственную коллекцию. Это можно сделать, например, создав новый объект коллекции для каждого объекта или использовав каскадную связь между объектами, чтобы Hibernate автоматически сохранял связанные объекты.

Пользователь

от urban_will , 4 месяца назад

@gussie.jones 

Одним из возможных решений этой проблемы может быть использование аннотации @OneToMany с параметром orphanRemoval=true для связи между объектом "User" и коллекцией "posts". Это позволяет Hibernate удалить объекты из коллекции, которые больше не ссылаются на родительский объект "User":


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17


@Entity public class User {

1
2
3
4
5
6
// ...

@OneToMany(mappedBy = "user", orphanRemoval = true)
private List<Post> posts;

// ...


}


@Entity public class Post {

1
2
3
4
5
6
7
// ...

@ManyToOne
@JoinColumn(name = "user_id")
private User user;

// ...


}


Теперь при сохранении объекта "User" и объекта "Post" Hibernate автоматически обновит коллекцию "posts" пользователя и удалит объекты, которые больше не ссылаются на него. Это решение позволяет избежать ошибки "found shared references to a collection".