HHH-18813: Fix of generated Insert-Query in CteUpdateHandler

In https://hibernate.atlassian.net/browse/HHH-18813 wurde ein Bug beschrieben der auftritt, wenn man zwei Tables mit InheritanceType.Joined verwendet.

Links zu Inheritance bzw. Joined table in der Hibernate Doku:
https://docs.hibernate.org/orm/7.2/userguide/html_single/#entity-inheritance
https://docs.hibernate.org/orm/7.2/userguide/html_single/#entity-inheritance-joined-table

Außerdem wurde bei einer der Tables die SecondaryTable-Annotation verwendet um einzelne Columns in einer separaten Table auszulagern.

Javadoc zu den Inheritance- und SecondaryTable-Annotations:
https://jakarta.ee/specifications/persistence/3.2/apidocs/jakarta.persistence/jakarta/persistence/secondarytable
https://jakarta.ee/specifications/persistence/3.2/apidocs/jakarta.persistence/jakarta/persistence/inheritance

Das Setup sieht dann wie folgt eigentlich recht einfach aus. Es gibt eine Base-Entity mit einer Id und eine weitere Entity, welche die Base-Entity extended und nur noch zwei Attribute enthält. Allerdings wird eines der beiden Attribute in einer weiteren Tabelle gespeichert.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class SecondaryTableEntityBase {

    private Long id;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SecondaryTable(name = "test")
public class SecondaryTableEntitySub extends SecondaryTableEntityBase {

    private Long b;

    private Long c;

    @Column
    public Long getB() {
        return b;
    }

    public void setB(Long b) {
        this.b = b;
    }

    @Column(table = "test")
    public Long getC() {
        return c;
    }

    public void setC(Long c) {
        this.c = c;
    }
}

Die daraus resultierenden Create-Statements sehen wie folgt aus:

Hibernate: 
    create table SecondaryTableEntityBase (
        id bigint not null,
        primary key (id)
    )
Hibernate: 
    create table SecondaryTableEntitySub (
        b bigint,
        id bigint not null,
        primary key (id)
    )
Hibernate: 
    create table test (
        c bigint,
        id bigint not null,
        primary key (id)
    )

Nun gibt es aber das Problem aus dem eigentlichen Bug-Report, das folgendes Update-Statement fehlschlägt:

update SecondaryTableEntitySub e set e.b=:b, e.c=:c

Nämlich mit der Fehlermeldung:

Caused by: org.postgresql.util.PSQLException: ERROR: column "b" of relation "test" does not exist

Eh klar, es liegt ja auch nur die Column c in der Tabelle test, nicht aber b.

Reproduziert werden kann das mit diesem Testcase:
https://github.com/peter1123581321/hibernate-test-case-templates/blob/HHH-18813/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/ORMUnitTestCase.java

Allerdings tritt der Fehler nicht mit H2 oder MySQL auf, aber zumindest mit Postgres.

Den Pull-Request zum Bugfix findet man dann hier:
https://github.com/hibernate/hibernate-orm/pull/10173

Der Fehler passierte hier letztlich im CteUpdateHandler und konnte sehr leicht gefixt werden, weil hier an einer Stelle nur zwei Listen verwechselt wurden:
https://github.com/hibernate/hibernate-orm/pull/10173/commits/2279fd10a43ef75bc6acc6181a55c3fe93986d2e#diff-7f87d8e3b206813710d227a659e8d3fe39cccc825b75a7ee9483c4fb0411a037

Somit tritt dieses Problem nun auch nicht mehr auf. 🙂