gpt4 book ai didi

java - Hibernate中的单向一对多映射产生冗余更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:59:01 24 4
gpt4 key购买 nike

我定义了两个类,Parent 和 Child。父项可以有一个子项列表。

@Entity
public class Parent {
@Id
@GeneratedValue(...)
@SequenceGenerator(...)
private long id;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)
private List<Child> children;

public Parent() {
children = new ArrayList<Child>();
}

public void addChild(Child child) { children.add(child); }
}

@Entity
public class Child {
@Id
@GeneratedValue(...)
@SequenceGenerator(...)
private long id;

// The "Child" table in the db also has a not-null "parent_id" column.
}

如果我向列表中添加一堆子项并保留父项,一切都会按预期工作:Hibernate 获取序列值,存储父项,然后存储所有子项。

然而,在完成所有这些之后,它会更新所有子项,将“parent_id”设置为它已经在插入中设置的值!

生成的 SQL 如下所示:

insert into PARENT (id) values (1)
insert into CHILD (parent_id, id) values (1, 1)
insert into CHILD (parent_id, id) values (1, 2)
insert into CHILD (parent_id, id) values (1, 3)
update CHILD set parent_id = 1 WHERE id = 1
update CHILD set parent_id = 1 WHERE id = 2
update CHILD set parent_id = 1 WHERE id = 3

如果我使这个关联成为双向的,它就可以正常工作,但是我需要在我的子类中引用父类,这是我想避免的事情。

存储库是一个 Spring Data JPA 存储库:

public interface ParentRepository extends PagingAndSortingRepository<Parent, Long> {}

创建和保存对象的(简化)代码:

Parent parent = new Parent();
parent.addChild(new Child());
parent.addChild(new Child());
repo.save(parent);

有什么建议吗?

最佳答案

你试过吗:

@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false, insertable=false, updatable=false)

关于java - Hibernate中的单向一对多映射产生冗余更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30893990/

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