gpt4 book ai didi

java - Hibernate 有时会在子实体中留下空的外键字段

转载 作者:行者123 更新时间:2023-11-29 13:55:56 26 4
gpt4 key购买 nike

最近我在处理 Hibernate/Postgres 数据时遇到了一个奇怪的现象。在未知条件下,Hibernate 创建子实体的孤儿(父的外键字段为空)。但我已将 @OneToMany 关系注释为 orphanRemoval。

“主要”实体:

@Entity
@Audited
public class Product {
@NotNull(groups = { CheckId.class })
@NotBlank(groups = { CheckId.class })
@Id
@Column(length = 32)
private String id = IdGenerator.createId();

@Version
private Integer version;

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name=Product.PRODUCT_ID)
@Index(name="idx_prod_ident")
private Set<Identifier> identifiers;

...
}

一个子实体:

@Entity
@Audited
public class Identifier {

@NotNull(groups = { CheckId.class })
@NotBlank(groups = { CheckId.class })
@Id
@Column(length = 32)
private String id = IdGenerator.createId();

@Version
private Integer version;

@NotNull
@Column(nullable=false, length=3)
@Index(name = "idx_id_prod_type")
private String type;

@NotNull
@Column(nullable=false, length=65)
@Index(name = "idx_id_prod_value")
private String value;

...
}

Product 中有许多与不同(但结构相似)实体的@OneToMany 关系。数百万条记录都写对了,但在其中的大多数记录中,我偶尔会遇到数百条 product_id 为空的记录。这怎么可能?

不幸的是,我无法轻易确定这种情况何时发生(由于缺少 product_id)。 product_id 也不是子实体的 Envers 历史表的一部分。所以我无法检查该产品是否仍然存在,以及服务最近对它做了什么。

供引用:当从父实体中删除子实体时,这是通过

完成的
product.getIdentifiers.remove(identifier);

or

product.getIdentifiers.removeAll(identifiers);

or

product.getIdentifiers.clear();

希望这是删除它们的有效方法;)

最佳答案

如果我正确理解你使用 FetchType.LAZY - 这意味着数据只会在 session 期间被检索,你可以使用 Hibernate.initialize 来检索 @OneToMany 字段或者可以使用 FetchType.EAGER 而不是 FetchType.LAZY

关于java - Hibernate 有时会在子实体中留下空的外键字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31943734/

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