Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当子实体被删除时,Hibernate会执行更新而不是删除操作_Java_Hibernate_Jpa - Fatal编程技术网

Java 当子实体被删除时,Hibernate会执行更新而不是删除操作

Java 当子实体被删除时,Hibernate会执行更新而不是删除操作,java,hibernate,jpa,Java,Hibernate,Jpa,当我从子列表(历史记录)item.getHistories()中删除一个旧的行时,我有两个实体,父(项)有一个历史记录实体列表。删除(0),我希望hibernate对子行执行一个delete操作,但hibernate将外键更新为null。 此更新导致非空冲突,因此外键具有非空约束 这是我的父实体: @Data @EqualsAndHashCode(callSuper = true) @Entity @Table(name = "item", schema = "public", catalog

当我从子列表(历史记录)
item.getHistories()中删除一个旧的行时,我有两个实体,父(项)有一个历史记录实体列表。删除(0)
,我希望hibernate对子行执行一个delete操作,但hibernate将外键更新为
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;
}
这是具有not null约束的历史记录表:

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生成的update子句:

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删除子项而不是尝试删除关系。

我认为您需要在replicingItem中的@OneToMany注释中添加一个“mappedBy”属性。我想是这样的:

@OneToMany(fetch = LAZY, cascade = ALL, orphanRemoval = true, mappedBy = "repricingItem")
@JoinColumn(name = "item_id")
private List<ItemHistory> histories;
@OneToMany(fetch=LAZY,cascade=ALL,orphaneremovation=true,mappedBy=“replicingitem”)
@JoinColumn(name=“item\u id”)
私人名单历史;
问题在于哪个实体是“所有者”。在这里可以找到比我能给出的更好的解释:

在双向映射中,您必须处理关系的两侧。删除bot侧没有帮助,hibernates仍会发出更新命令:History entryToDelete=item.getHistories().get(0);replicingItem.getHistories().remove(entryToDelete);会话。删除(entryToDelete);session.flush();我想问题出在地图上我在这里解释了我的解决方案:。
@OneToMany(fetch = LAZY, cascade = ALL, orphanRemoval = true, mappedBy = "repricingItem")
@JoinColumn(name = "item_id")
private List<ItemHistory> histories;