gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:38:05 25 4
gpt4 key购买 nike

大家。我有一对多关系的客户和服务表 - 一个客户可以没有或有很多服务。 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;

谢谢你的帮助。

最佳答案

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

为了避免这个问题你可以:

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

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

最好的问候

关于java - 不需要的行为——当父元素更新时,Hibernate 删除用@ElementCollection 注释的子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18715942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com