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. 🙂
