1

每个人。我有一对多关系的客户和服务表 - 一个客户可以没有或有很多服务。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 或空集,则更新 Hibernate 会删除所有引用更新客户的服务表行。我想避免这种行为。我希望这个serviceIds成员对于 Hibernate 是只读的,并且当客户在数据库中更新时被忽略 - 即我只想更新客户表而不是其他任何东西。是否可以使用ElementCollection来实现这一点?

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

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

感谢您的帮助。

4

1 回答 1

3

当修改 - 甚至 - 在@ElementCollection中的单个元素时,Hibernate 将删除旧集合(保留在 DB 中的那个),然后插入该集合的新图像。这个问题已经在这里问过:
Hibernate - @ElementCollection - Strange delete/insert behavior

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

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

  • 创建一个包装您的 Integer 的实体类(+ @Generated @Id)。

此致

于 2014-02-02T21:27:50.150 回答