diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/UpdateEntityWithIdClassAndJsonFieldTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/UpdateEntityWithIdClassAndJsonFieldTest.java new file mode 100644 index 0000000000..f40d16c4b8 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/UpdateEntityWithIdClassAndJsonFieldTest.java @@ -0,0 +1,213 @@ +package org.hibernate.orm.test.mapping.embeddable; + +import java.io.Serializable; +import java.util.Objects; + +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import org.hibernate.testing.orm.junit.DialectFeatureChecks; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.RequiresDialectFeature; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.Assert.assertTrue; + +@DomainModel( + annotatedClasses = { + UpdateEntityWithIdClassAndJsonFieldTest.MyEntity.class + } +) +@SessionFactory +@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsJsonAggregate.class) +@JiraKey("HHH-17159") +public class UpdateEntityWithIdClassAndJsonFieldTest { + private static final String NAME = "Name"; + private static final Long PLANT_ID = 1l; + private static final Long ID_2 = 2l; + private static final String DESCRIPTION = "first description"; + private static final String UPDATED_DESCRIPTION = "updated"; + + @BeforeAll + public void setUp(SessionFactoryScope scope) { + scope.inTransaction( + session -> { + MyEntity entity = new MyEntity( NAME, PLANT_ID, new Description( DESCRIPTION ), ID_2 ); + session.persist( entity ); + } + ); + } + + @Test + public void updateTest(SessionFactoryScope scope) { + scope.inTransaction( + session -> { + int updatedRows = session.createQuery( + "UPDATE MyEntity u SET u.hasPictures = :hasPicture WHERE u.id2 = :entityId" ) + .setParameter( "hasPicture", Boolean.TRUE ) + .setParameter( "entityId", ID_2 ) + .executeUpdate(); + assertTrue( updatedRows > 0 ); + } + ); + + scope.inTransaction( + session -> { + MyEntity myEntity = session.createQuery( "from MyEntity m where m.id2 = :id2", MyEntity.class ) + .setParameter( "id2", ID_2 ) + .uniqueResult(); + assertThat( myEntity.getHasPictures() ).isTrue(); + assertThat( myEntity.getDescription().getText() ).isEqualTo( DESCRIPTION ); + } + ); + + scope.inTransaction( + session -> { + int updatedRows = session.createQuery( + "UPDATE MyEntity u SET u.description.text = :description WHERE u.id2 = :entityId" ) + .setParameter( "description", UPDATED_DESCRIPTION ) + .setParameter( "entityId", ID_2 ) + .executeUpdate(); + assertTrue( updatedRows > 0 ); + } + ); + + scope.inTransaction( + session -> { + MyEntity myEntity = session.createQuery( "from MyEntity m where m.id2 = :id2", MyEntity.class ) + .setParameter( "id2", ID_2 ) + .uniqueResult(); + assertThat( myEntity.getHasPictures() ).isTrue(); + assertThat( myEntity.getDescription().getText() ).isEqualTo( UPDATED_DESCRIPTION ); + } + ); + } + + public static class MyEntityPK implements Serializable { + + private String name; + private Long plantId; + + public MyEntityPK() { + } + + public String getName() { + return name; + } + + public Long getPlantId() { + return plantId; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 97 * hash + Objects.hashCode( this.name ); + hash = 97 * hash + Objects.hashCode( this.plantId ); + return hash; + } + + @Override + public boolean equals(Object obj) { + if ( this == obj ) { + return true; + } + if ( obj == null ) { + return false; + } + if ( getClass() != obj.getClass() ) { + return false; + } + final MyEntityPK other = (MyEntityPK) obj; + if ( !Objects.equals( this.name, other.getName() ) ) { + return false; + } + return Objects.equals( this.plantId, other.getPlantId() ); + } + } + + @IdClass(MyEntityPK.class) + @Entity(name = "MyEntity") + public static class MyEntity { + + @Id + private String name; + + @Id + private Long plantId; + + @JdbcTypeCode(SqlTypes.JSON) + private Description description; + + private Long id2; + + private Boolean hasPictures = Boolean.FALSE; + + public MyEntity() { + } + + public MyEntity(String name, Long plantId, Description description, Long id2) { + this.name = name; + this.plantId = plantId; + this.description = description; + this.id2 = id2; + } + + public String getName() { + return name; + } + + public MyEntity setName(String name) { + this.name = name; + return this; + } + + public Long getPlantId() { + return plantId; + } + + + public Long getId2() { + return id2; + } + + + public Boolean getHasPictures() { + return hasPictures; + } + + + public Description getDescription() { + return description; + } + } + + @Embeddable + public static class Description { + + @Column(name = "TEXT_COLUMN") + private String text; + + public Description() { + } + + public Description(String text) { + this.text = text; + } + + public String getText() { + return text; + } + } +}