有兩個JPA實體:用戶和具有一對多關係的順序。使用延遲初始化屬性分離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;
}
沒有改變任何東西:(
它不適合我沒關係將有關用戶信息的集合訂單或不參加我只是想用這組的工作,而不是去修改它。
任何人可以幫助我嗎?:)因爲數據請求交易之外發生
謝謝。我想澄清兩點:我是否正確理解hibernate沒有強制加載當前對象的所有惰性關聯的標準機制 - 只有適當的方法或查詢調用?我沒有辦法讓休眠忽略當前對象的惰性關聯(將它們設置爲空)? – mikhail 2010-09-06 01:22:15
我明白,試圖忽視懶惰的嘗試是錯誤的,但我純粹有學術興趣。例如,我通過實體管理器獲得了User類的對象:「User user = entityManager(User.class,1)」。此時「訂單」屬性等於空,因爲它很懶。是否有可能從休眠狀態「分離」對象「用戶」,以防止訪問方法「getOrders」期間的屬性「命令」初始化? – mikhail 2010-09-06 11:09:32
@mikhail'在Hibernate論壇的訪問方法「getOrders」中搜索「unproxy」或「deproxy」,是否可以從hibernate中「分離」對象「用戶」 – 2010-09-07 07:08:50