Чтение рекурсивной иерархии JPA — StackOverflowError с FetchType.EAGER, но LazyInitializationException с FetchType.LAZYJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Чтение рекурсивной иерархии JPA — StackOverflowError с FetchType.EAGER, но LazyInitializationException с FetchType.LAZY

Сообщение Anonymous »

Я работаю со следующими объектами:
UserEntity:

Код: Выделить всё

@Entity
@Table (name = "users", uniqueConstraints = @UniqueConstraint(columnNames={"name"}))
public class UserEntity {

@Id
@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "user_id_seq")
private Long id;

@Column( name = "name")
private String name;

private int level;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
private Set berryInventory;
BerryInventoryEntity:

Код: Выделить всё

@Entity
@Table (name = "berry_inventory")
public class BerryInventoryEntity {

@Id
@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "inventory_id_seq")
private Long id;

@ManyToOne (optional = false)
@JoinColumn (name = "user_id")
private UserEntity user;

@ManyToOne (optional = false)
@JoinColumn (name = "berry_id")
private BerryEntity berry;

private int quantity;
}
Я тестирую репозиторий BerryInventory и столкнулся с проблемой. Я создал экземпляр BerryInventoryEntity и сохранил его с помощью репозитория:

Код: Выделить всё

BerryInventoryEntity berryInventory = BerryInventoryEntity.builder()
.berry(berry)
.user(user)
.quantity(1)
.build();

berryInventoryRepository.save(berryInventory);
Затем я использовал этот запрос, чтобы получить только что сохраненный BerryInventoryEntity:

Код: Выделить всё

@Query("SELECT b FROM BerryInventoryEntity b WHERE b.user = :user")
Iterable findInventoryOfUser(UserEntity user);
Вот так:

Код: Выделить всё

Iterable berryInventoryCreated = berryInventoryRepository.findInventoryOfUser(userCreated);
Но тогда вы получаете две разные ошибки в зависимости от FetchType в отношении @OneToMany, указанном в UserEntity.
Если FetchType имеет значение «LAZY», UserEntity поставляется с экземпляром BerryInventoryEntity, который выдает исключение:

Метод выдал исключение «org.hibernate.LazyInitializationException». Невозможно оценить com.dpr.berry.domain.entities.UserEntity.toString()

Но если я изменю его на «EAGER», то выдается StackOverFlowError, поскольку UserEntity содержит список BerryInventoryEntity, который также содержит UserEntity и так далее.
Могу ли я получить BerryInventoryEntity, для которого также не указан UserEntity с BerryInventoryEntity? Как правильно решить эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -but-lazyi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»