不需要的行为 - 当父元素更新时,Hibernate会删除使用@ElementCollection注释的子元素

时间:2013-09-10 10:03:15

标签: java hibernate

大家。 我有一对多关系的客户和服务表 - 一个客户可以没有或有很多服务。 Service表有一个customer_id列,它是引用Customer表主键的外键。 从数据库中检索客户时,我只需要获取相关服务的ID,这就是我决定使用@ ElementCollection 注释的原因。 我对客户的映射如下:

 @Entity
 @Table(name = "customer")
 public class CustomerEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer      id;

    @Column(nullable = false)
    private String       name;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "service", joinColumns = @JoinColumn(name = "customer_id", updatable = false, insertable = true))
    @Column(name = "id", updatable = false, insertable = true)
    private Set<Integer> serviceIds;
}

当我从数据库中获取数据时,一切都很完美。问题是当我尝试更新数据库中的客户时。更新后,如果客户实体的 serviceIds 成员设置为null或空Set,Hibernate将删除引用更新客户的所有Service表行。我想避免这种行为。我希望这个 serviceIds 成员只读取Hibernate,并在数据库中更新客户时被忽略 - 即我只想更新客户表而不是其他任何内容。是否可以使用 ElementCollection 实现此目的?

顺便说一下,我尝试了以下映射,即使我将 serviceIds 设置为null或空Set,客户的更新也不会导致Service表中的任何删除。

@OneToMany
@JoinColumn(name = "customer_id", referencedColumnName = "id", updatable = false, insertable = false)
private Set<ServiceEntity> serviceIds;

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

当修改 - 甚至 - @ElementCollection 中的单个元素时,Hibernate将删除旧集合(持久存储在DB中的集合),然后插入集合的新图像。这里已经提出了这个问题:
 Hibernate - @ElementCollection - Strange delete/insert behavior

为了避免这个问题,您可以:

  • 使用带有 @OrderColumn 注释的整数列表,如上面的链接所述。

  • 创建一个包裹整数的实体类(+ @Generated @Id )。

祝你好运