Détacher JPA objets avec lazy initialisé propriétés

Il y a deux entités JPA: l'Utilisateur et de l'Ordre de un à plusieurs " de la relation.

/**
* 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;
}
}

- Je utiliser ces entités dans ma couche de service des classes où chaque méthode s'exécute dans la transaction. Tout est bien sauf cas lorsque les méthodes de la couche de service des classes doit retourner ces entités.

@Transactional(readOnly=true)
public Set<Order> getOrders() {
Set<Order> orders = user.getOrders();
return orders;
}

Cette méthode retourne les données. Mais lorsque j'essaie d'accéder à recevoir des éléments de collection à j'exception de catch: "org.mise en veille prolongée.LazyInitializationException: échec paresseusement initialiser une collection de rôle: le package.De l'utilisateur.les commandes, pas de session ou la session a été fermée".

Ainsi, il a été l'exception. Je pensais que le détachement résultat va résoudre mon problème, mais le truc comme ça

@Transactional(readOnly=true)
public Set<Order> getOrders() {
Set<Order> orders = user.getOrders();
for(Order order: orders)
entityManager.detach(order);
return orders;
}

n'a rien changé 🙁

Il n'est pas question pour moi d'infos sur les utilisateurs de suivre dans l'ensemble de commandes ou pas. Je veux juste travailler avec cet ensemble et de ne pas la modifier.

Quelqu'un peut-il m'aider? 🙂

OriginalL'auteur mikhail | 2010-09-04