Spring JPA: получение StackOverflowError при использовании FetchType.EAGER для объекта, но получение исключения LazyInitJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring JPA: получение StackOverflowError при использовании FetchType.EAGER для объекта, но получение исключения LazyInit

Сообщение 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, который выдает исключение:

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

Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate com.dpr.berry.domain.entities.UserEntity.toString()
Но если я изменю его на «EAGER», то выдается StackOverFlowError, потому что UserEntity содержит список BerryInventoryEntity, который также содержит UserEntity и т. д.
Могу ли я получить BerryInventoryEntity, что его UserEntity также не содержит BerryInventoryEntity? Как правильно решить эту проблему?

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

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

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

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

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

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