Отсоединение объектов JPA с отложенными инициализированными свойствами

Существуют две сущности JPA: User и Order с отношением один-ко-многим.

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

ничего не изменил: (

Для меня не имеет значения, будет ли информация о пользователях присутствовать в наборе заказов или нет. Я просто хочу работать с этим набором и не собираюсь его модифицировать.

Кто-нибудь может мне помочь? :)

5
задан Pascal Thivent 8 September 2010 в 01:31
поделиться