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

时间:2018-12-10 22:01:30

标签: hibernate jpa

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

父母:

a

孩子:

@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);
    }
}

我添加@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; } } Parent的实例,如下所示:

Child

这工作正常,并导致以下SQL:

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();
}

是否可以删除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行时设置childIndex

我尝试在Child注释上设置nullable=false,但这导致了OrderColumn错误,因为Hibernate仍然尝试插入null value in column "childindex" violates not-null constraint列而不设置{{ 1}}。

谢谢!

编辑:

按照米克的建议,我向Child实体明确添加了Child属性,如下所示:

childindex

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

1 个答案:

答案 0 :(得分:0)

好吧,听起来好像当您合并父实体时,Hibernate在这里发挥了很大的作用。似乎可以推断子实体上必须有一个附加属性-但是这个事实很懒惰-因此您进行了两次UPDATE。如果您还在子实体上明确定义了适当的“ childIndex”属性,该怎么办?该@Column注释将是注释您的nullable-requirements的正确位置。同样,这也将迫使Hibernate在第一个UPDATE语句后立即插入值。