From e06a3dcdbc9fe412a2090e59f2cc92a647cb72ec Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Thu, 2 Dec 2021 12:49:16 -0600 Subject: [PATCH] HHH-14885 - New composite user-type HHH-14950 - Support mapping of embeddables with no setters (assuming a custom instantiator or repo-strategy is used) Tests illustrating that HHH-14950 does indeed happen --- .../instantiator/intf/InstantiationTests.java | 16 ++++++++++++---- .../strategy/instantiator/intf/Name.java | 7 ------- .../strategy/instantiator/intf/Person.java | 6 ++++++ .../instantiator/intf2/InstantiationTests.java | 4 ++++ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/InstantiationTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/InstantiationTests.java index f85e68f555..4e667a4e5c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/InstantiationTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/InstantiationTests.java @@ -6,13 +6,13 @@ */ package org.hibernate.orm.test.mapping.embeddable.strategy.instantiator.intf; -import java.lang.reflect.Method; - +import org.hibernate.mapping.Collection; import org.hibernate.mapping.Component; import org.hibernate.mapping.Property; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.DomainModelScope; +import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.NotImplementedYet; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; @@ -21,11 +21,15 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** - * @author Steve Ebersole + * Builds on {@link org.hibernate.orm.test.mapping.embeddable.strategy.instantiator.intf2.InstantiationTests} + * attempting to map an interface. + * + * At the moment this does not work, as Hibernate fails without setters */ @DomainModel( annotatedClasses = { Person.class, NameImpl.class } ) @SessionFactory -@NotImplementedYet( strict = false ) +@NotImplementedYet( reason = "Hibernate requires setter" ) +@JiraKey( "HHH-14950" ) public class InstantiationTests { @Test public void modelTest(DomainModelScope scope) { @@ -33,6 +37,10 @@ public class InstantiationTests { final Property name = personMapping.getProperty( "name" ); final Component nameMapping = (Component) name.getValue(); assertThat( nameMapping.getPropertySpan() ).isEqualTo( 2 ); + + final Property aliases = personMapping.getProperty( "aliases" ); + final Component aliasMapping = (Component) ( (Collection) aliases.getValue() ).getElement(); + assertThat( aliasMapping.getPropertySpan() ).isEqualTo( 2 ); }); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Name.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Name.java index b6e462fbca..f4b20d1719 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Name.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Name.java @@ -6,17 +6,10 @@ */ package org.hibernate.orm.test.mapping.embeddable.strategy.instantiator.intf; -import jakarta.persistence.Basic; -import jakarta.persistence.Embeddable; - /** * @author Steve Ebersole */ -@Embeddable public interface Name { - @Basic String getFirstName(); - - @Basic String getLastName(); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Person.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Person.java index 4350473d84..d9bdf598b1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Person.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf/Person.java @@ -11,6 +11,8 @@ import java.util.Set; import org.hibernate.annotations.EmbeddableInstantiator; +import jakarta.persistence.Access; +import jakarta.persistence.AccessType; import jakarta.persistence.ElementCollection; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; @@ -24,12 +26,16 @@ import jakarta.persistence.Table; public class Person { @Id public Integer id; + @Embedded @EmbeddableInstantiator( NameInstantiator.class ) + @Access( AccessType.PROPERTY ) public Name name; + @ElementCollection @Embedded @EmbeddableInstantiator( NameInstantiator.class ) + @Access( AccessType.PROPERTY ) public Set aliases; //end::embeddable-instantiator-property[] diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf2/InstantiationTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf2/InstantiationTests.java index 93a59e99b8..358a5e23b8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf2/InstantiationTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/strategy/instantiator/intf2/InstantiationTests.java @@ -12,6 +12,8 @@ import org.hibernate.mapping.Property; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.DomainModelScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.NotImplementedYet; import org.hibernate.testing.orm.junit.SessionFactory; import org.junit.jupiter.api.Test; @@ -28,6 +30,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ @DomainModel( annotatedClasses = { Person.class, Name.class } ) @SessionFactory +@NotImplementedYet( reason = "Hibernate requires setter" ) +@JiraKey( "HHH-14950" ) public class InstantiationTests { @Test public void modelTest(DomainModelScope scope) {