From 8f3cc245ceaccb105152d00dfd098df5d5337873 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Wed, 10 Jan 2024 15:17:17 +0100 Subject: [PATCH] HHH-17632 Add test for issue --- .../update/JoinedInheritanceTest.java | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/bytecode/enhancement/update/JoinedInheritanceTest.java diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bytecode/enhancement/update/JoinedInheritanceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bytecode/enhancement/update/JoinedInheritanceTest.java new file mode 100644 index 0000000000..5485d34346 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bytecode/enhancement/update/JoinedInheritanceTest.java @@ -0,0 +1,184 @@ +package org.hibernate.orm.test.bytecode.enhancement.update; + +import java.util.List; + +import org.hibernate.annotations.Formula; + +import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner; +import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; +import org.hibernate.testing.orm.junit.JiraKey; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; +import jakarta.persistence.Table; + +import static jakarta.persistence.FetchType.LAZY; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +@RunWith(BytecodeEnhancerRunner.class) +@JiraKey("HHH-17632") +public class JoinedInheritanceTest extends BaseNonConfigCoreFunctionalTestCase { + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + Plane.class, A320.class + }; + } + + @Before + public void setUp() { + inTransaction( + session -> { + A320 a320 = new A320( 1l, "Airbus A320", 101, true, "1.0" ); + session.persist( a320 ); + } + ); + } + + @After + public void tearDown() { + inTransaction( + session -> { + session.createMutationQuery( "delete from A320" ).executeUpdate(); + } + ); + } + + @Test + public void testUpdateField() { + inTransaction( + session -> { + A320 referenceById = session.getReference( A320.class, 1L ); + + referenceById.setSoftwareVersion( "2.0" ); + + session.flush(); + session.clear(); + + List airbusA320 = session.createQuery( + "select a from A320 a where a.description = 'Airbus A320'" ).getResultList(); + assertFalse( airbusA320.isEmpty() ); + assertEquals( 1, airbusA320.size() ); + A320 a320 = airbusA320.get( 0 ); + assertEquals( "2.0", a320.getSoftwareVersion() ); + assertTrue( a320.getLarge() ); + } + ); + } + + @Test + public void testUpdateTwoFields() { + inTransaction( + session -> { + A320 referenceById = session.getReference( A320.class, 1L ); + + referenceById.setSoftwareVersion( "2.0" ); + referenceById.setNbrOfSeats( 103 ); + + session.flush(); + session.clear(); + + List airbusA320 = session.createQuery( + "select a from A320 a where a.description like 'Airbus A320'" ).getResultList(); + assertFalse( airbusA320.isEmpty() ); + assertEquals( 1, airbusA320.size() ); + A320 a320 = airbusA320.get( 0 ); + assertEquals( "2.0", a320.getSoftwareVersion() ); + assertEquals( 103, a320.getNbrOfSeats() ); + assertTrue( a320.getLarge() ); + } + ); + } + + + @Entity(name = "A320") + @Table(name = "a320") + public static class A320 extends Plane { + + @Column(name = "software_version") + private String softwareVersion; + + public A320() { + super(); + } + + public A320(Long id, String description, int nbrOfSeats, Boolean large, String softwareVersion) { + super( id, description, nbrOfSeats, large ); + this.softwareVersion = softwareVersion; + } + + public String getSoftwareVersion() { + return softwareVersion; + } + + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + } + + @Table(name = "plane_table") + @Inheritance(strategy = InheritanceType.JOINED) + @DiscriminatorColumn + @Entity(name = "Plane") + public static class Plane { + + @Id + private Long id; + + @Column + private String description; + + @Column(name = "nbr_of_seats") + private int nbrOfSeats; + + @Basic(fetch = LAZY) + private Boolean large = false; + + public Plane() { + } + + public Plane(Long id, String description, int nbrOfSeats, Boolean large) { + this.id = id; + this.description = description; + this.nbrOfSeats = nbrOfSeats; + this.large = large; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getNbrOfSeats() { + return nbrOfSeats; + } + + public void setNbrOfSeats(int nbrOfSeats) { + this.nbrOfSeats = nbrOfSeats; + } + + public Boolean getLarge() { + return large; + } + + public void setLarge(Boolean large) { + this.large = large; + } + } +}