gpt4 book ai didi

hibernate - Hibernate/JPA 中的@OrderColumn 导致冗余的 UPDATE SQL 语句

转载 作者:行者123 更新时间:2023-12-05 07:27:52 26 4
gpt4 key购买 nike

我有一个简单的双向父/子关系,其中子项位于有序列表中。

父级:

@Entity
@Table(name = "Parent")
public class Parent {
@Id
private String name;

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@OrderColumn(name = "childIndex")
private final List<Child> children = new ArrayList<>();

public void setName(final String name) {
this.name = name;
}

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

child :

@Entity
@Table(name = "Child")
public class Child {

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "hibernate-uuid", strategy = "uuid2")
private String id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentName")
private Parent parent;

Child() {}

public Child(final Parent parent) {
this.parent = parent;
}
}

我添加了一个 ParentChild 的实例,如下所示:

SessionFactory sessionFactory = ...
try (Session session = sessionFactory.openSession()) {
session.beginTransaction();

Parent parent = new Parent();
parent.setName("SomeName");
Child child = new Child(parent);
parent.addChild(child);

session.merge(parent);

session.getTransaction()
.commit();
}

这工作正常并产生以下 SQL:

Hibernate: select parent0_.name as name1_1_1_, children1_.parentName as parentNa2_0_3_, children1_.id as id1_0_3_, children1_.itemIndex as itemInde3_3_, children1_.id as id1_0_0_, children1_.parentName as parentNa2_0_0_ from Parent parent0_ left outer join Child children1_ on parent0_.name=children1_.parentName where parent0_.name=?
Hibernate: insert into Parent (name) values (?)
Hibernate: insert into Child (parentName, id) values (?, ?)
Hibernate: update Child set itemIndex=? where id=?

是否可以删除 UPDATE 语句并在插入 Child 行时设置 childIndex

我尝试在 OrderColumn 注释上设置 nullable=false,但这导致 列“childindex”中的空值违反了非空约束 错误,因为 Hibernate 仍然尝试插入 Child 列而不设置 childindex

提前致谢!

编辑:

根据 Mick 的建议,我明确地向 Child 实体添加了一个 childIndex 属性,如下所示:

@Column(nullable = false)
private int childIndex;

虽然这会导致列变为非空,但它不会删除额外的 UPDATE 语句。通过此更改,Hibernate 似乎在 INSERT 上将 childIndex 设置为 0(无论子项实际是什么索引;我已经通过添加更多子项对此进行了测试),然后执行更新以更正指数。我假设 Hibernate 只是使用恰好在 Child 对象上的任何值(默认情况下为 0),然后在 INSERT 完成后更新它,即使它恰好是正确的值。

最佳答案

好的,当您合并父实体时,听起来 Hibernate 在这里做了很多魔术。似乎推断子实体上必须有一个附加属性 - 但这个事实被发现是懒惰的 - 因此你的双重更新。如果您还在子实体上显式定义了适当的“childIndex”属性怎么办? @Column 注释将是注释您的可空要求的正确位置。这也应该强制 Hibernate 立即使用第一个 UPDATE 语句插入值。

关于hibernate - Hibernate/JPA 中的@OrderColumn 导致冗余的 UPDATE SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53714332/

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