2012-11-27 95 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