2017-07-26 59 views
1

在我的应用程序中,每个客户可以有多个帐户。我有以下数据结构(很多略去了):Jpa:删除依赖项而不是更新它们

@Entity 
@Table(name = "CUSTOMER") 
public class Customer { 

    @Id 
    @Column(length = 36, name = "CUSTOMER_ID", nullable = false, unique = true) 
    private String id; 

    @OneToMany 
    @JoinColumn(name = "OWNER_ID", referencedColumnName = "CUSTOMER_ID") 
    private List<Account> accounts; 
} 



@Entity 
@Table(name = "ACCOUNT") 
public class Account { 

    @Id 
    @Column(length = 36, name = "ACCOUNT_ID", nullable = false, unique = true) 
    private String id; 

    @Column(name = "OWNER_ID", nullable = false) 
    private String ownerId; 
} 

如果我使用JPA删除客户,如

entityManager.remove(customer); 

它会尝试更新与相关ACCOUNT.OWNER_ID领域空值。 OWNER_ID不是空的,所以它抛出一个JDBCException并回滚事务。

我需要做的是将相关的ACCOUNT行删除(如果有的话)。我怎样才能做到这一点?

谢谢

更新:我与

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 

尝试过,但它不会改变的行为:仍试图用NULL更新。

+0

你试过了吗@OneToMany(orphanRemoval =“true”)? –

+0

我已经试过了,但它没有解决问题:仍然尝试使用null更新ACCOUNT.OWNER_ID字段。 – Androrider

回答

0

我想你需要使用级联才能删除子元素。试试这个:

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "OWNER_ID", referencedColumnName = "CUSTOMER_ID") 
private List<Account> accounts; 

您还应该在您的帐户中通过ManyToOne关系引用客户,而不是String ID。我认为这应该可以解决你的问题:

@Column(name = "OWNER_ID", nullable = false) 
@ManyToOne 
private Customer owner; 
+0

我已经试过了,但它没有解决问题:仍然尝试使用null更新ACCOUNT.OWNER_ID字段。 – Androrider

+0

我已更新我的答案@Androrider – Plog