大家。 我有一对多关系的客户和服务表 - 一个客户可以没有或有很多服务。 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;
感谢您的帮助。
答案 0 :(得分:3)
当修改 - 甚至 - @ElementCollection 中的单个元素时,Hibernate将删除旧集合(持久存储在DB中的集合),然后插入集合的新图像。这里已经提出了这个问题:
Hibernate - @ElementCollection - Strange delete/insert behavior
为了避免这个问题,您可以:
使用带有 @OrderColumn 注释的整数列表,如上面的链接所述。
创建一个包裹整数的实体类(+ @Generated @Id )。
祝你好运