gpt4 book ai didi

java - 当子实体被删除时,Hibernate 确实执行更新而不是删除操作

转载 作者:行者123 更新时间:2023-11-30 03:16:30 25 4
gpt4 key购买 nike

当我从子列表(历史)中删除旧行时,我有两个实体,父(项目)具有历史实体列表item.getHistories().remove(0) 我希望 hibernate 对子行执行删除操作,但 hibernate 将外键更新为 null。此更新会导致NOT NULL VIOLATION,因此外键具有NOT NULL 约束。

这是我的父实体:

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "item", schema = "public", catalog = "foo")
public class RepricingItem extends BaseDatesEntity {

@Id
@SequenceGenerator(name="item_id_seq", sequenceName = "item_id_seq", allocationSize = 5)
@GeneratedValue(strategy = SEQUENCE, generator = "item_id_seq")
@Column(name = "id", unique = true, insertable = true, updatable = false, nullable = false)
protected Long id;

@Size(min = 1, max = 100)
@Column(name = "title", nullable = false, insertable = true, updatable = true)
private String title;

@OneToMany(fetch = LAZY, cascade = ALL, orphanRemoval = true)
@JoinColumn(name = "item_id")
private List<ItemHistory> histories;
}

这是 child :

@Data
@EqualsAndHashCode(callSuper=true)
@Entity
@Table(name = "item_history", schema = "public", catalog = "foo")
public class RepricingItemBuyBoxHistory extends BaseEntity {

@ManyToOne(fetch = LAZY, optional = false)
@JoinColumn(name = "item_id", nullable = false, updatable = false)
private RepricingItem repricingItem;

@Size(min = 1, max = 255)
@Column(name = "some_history_data", nullable = false, insertable = true, updatable = false)
private String someHistoryData;
}

这是具有非空约束的历史表:

CREATE TABLE "item_history" (
id BIGSERIAL PRIMARY KEY,
item_id BIGINT NOT NULL REFERENCES "item" (id) ON DELETE CASCADE,
inserted TIMESTAMP WITHOUT TIME ZONE,
updated TIMESTAMP WITHOUT TIME ZONE,
some_history_data VARCHAR(255) NOT NULL
) WITH (OIDS =FALSE);

这是hibernate生成的更新子句:

11:17:00,794 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Error: 0, SQLState: 23502
11:17:00,794 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Batch entry 0 update foo.public.item_history set item_id=null where item_id=903372 and id=245 was aborted. Call getNextException to see the cause.

我怎样才能告诉hibernate删除 child 而不是尝试删除关系。

最佳答案

我认为您需要将“mappedBy”属性添加到 RepricingItem 中的 @OneToMany 注释中。我想是这样的:

@OneToMany(fetch = LAZY, cascade = ALL, orphanRemoval = true, mappedBy = "repricingItem")
@JoinColumn(name = "item_id")
private List<ItemHistory> histories;

问题与哪个实体是“所有者”有关。比我能给出的更好的解释可以在这里找到: inverse = “true” example and explanation

关于java - 当子实体被删除时,Hibernate 确实执行更新而不是删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436529/

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