Есть два объекта JPA: Пользователь и Заказ с отношением один ко многим.
/**
* User DTO
*/
@Entity
@Table(name="user")
public class User implements Serializable {
private static final long serialVersionUID = 8372128484215085291L;
private Long id;
private Set<Order> orders;
public User() {}
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenceUser")
public Long getId() {
return this.id;
}
private void setId(Long id) {
this.id = id;
}
@OneToMany(mappedBy="user", cascade=CascadeType.PERSIST, fetch=FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
/**
* Order DTO
*/
@Entity
@Table(name="order")
public class Order implements Serializable {
private static final long serialVersionUID = 84504362507297200L;
private Long id;
private User user;
public Order() {
}
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenceOrder")
public Long getId() {
return this.id;
}
private void setId(Long id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name="user_id")
public User getUser(){
return user;
}
public void setUser(User user){
this.user = user;
}
}
Я использую эти объекты в моих классах уровня обслуживания, где каждый метод выполняется в транзакции.Все хорошо, кроме случаев, когда методы классов сервисного уровня должны возвращать эти сущности.
@Transactional(readOnly=true)
public Set<Order> getOrders() {
Set<Order> orders = user.getOrders();
return orders;
}
Этот метод хорошо возвращает данные.Но когда я пытаюсь получить доступ к полученным элементам коллекции, у меня возникает исключение: «org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: package.User.orders, ни один сеанс или сеанс не был закрыт».было исключено.Я думал, что результат отсоединения решит мою проблему, но такой трюк
@Transactional(readOnly=true)
public Set<Order> getOrders() {
Set<Order> orders = user.getOrders();
for(Order order: orders)
entityManager.detach(order);
return orders;
}
ничего не изменил: (
Мне не важно, будет ли информация о пользователях присутствовать в наборезаказов или нет. Я просто хочу работать с этим набором и не собираюсь изменять его.
Кто-нибудь может мне помочь?:)