2012-11-27 135 views
4

我有很多對許多像這樣的休眠定義的關係:錯誤的更新而級聯許多一對多的關係

用戶

public class User{ 

private List<UserCustomer> userCustomerList; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "id.user", cascade=CascadeType.ALL) 
    public List<UserCustomer> getUserCustomerList() { 
     return userCustomerList; 
    } 
} 

UserCustomer

@Entity 
@Table(name = "RTDB_USER_CUSTOMER") 
@Component("userCustomerEntity") 
@AssociationOverrides({ 
    @AssociationOverride(name = "id.user", 
      joinColumns = @JoinColumn(name = "ID_USER")), 
    @AssociationOverride(name = "id.customer", 
      joinColumns = @JoinColumn(name = "ID_CUSTOMER")) }) 

public class UserCustomer { 

    @EmbeddedId 
    public UserCustomerId getId() { 
     return id; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ @JoinColumn(name = "ID_ROLE_CUSTOMER", referencedColumnName = "ID") })   public RoleCustomer getRoleCustomer() { 
     return roleCustomer; 
    } 

} 

因此,用戶有一個UserCustomer列表,表示用戶對客戶的角色。問題是,當我們改變客戶的角色並致電update(),而不是更新一行時,我們會獲得所有更新的行都具有相同的角色。當我們調用merge()時,它開始執行大量查詢,然後給出stackoverflow例外情況¿這可能是映射問題嗎?

+0

是否有你有連接表(USER_CUSTOMER)的實體的原因?在JPA中這不是傳統的做法 –

+0

是的,這是因爲連接表具有附加屬性(角色)。有沒有辦法做到這一點? –

+0

好吧,我錯過了,你有用戶,客戶和USER_CUSTOMER有用戶ID,客戶ID和角色? –

回答

1

你能發表表格和更新代碼嗎?

我認爲你直接從UserCustomer更新角色,應該更新所有角色,據我瞭解你不想更新UserCustomer但只有RoleCustomer。嘗試獲取RoleCustomer並更新它,而不是UserCustomer