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
This commit is contained in:
Steve Ebersole 2021-12-02 12:49:16 -06:00
parent 4b69854b9c
commit e06a3dcdbc
4 changed files with 22 additions and 11 deletions

View File

@ -6,13 +6,13 @@
*/ */
package org.hibernate.orm.test.mapping.embeddable.strategy.instantiator.intf; 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.Component;
import org.hibernate.mapping.Property; import org.hibernate.mapping.Property;
import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.DomainModelScope; 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.NotImplementedYet;
import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope; 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; 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 } ) @DomainModel( annotatedClasses = { Person.class, NameImpl.class } )
@SessionFactory @SessionFactory
@NotImplementedYet( strict = false ) @NotImplementedYet( reason = "Hibernate requires setter" )
@JiraKey( "HHH-14950" )
public class InstantiationTests { public class InstantiationTests {
@Test @Test
public void modelTest(DomainModelScope scope) { public void modelTest(DomainModelScope scope) {
@ -33,6 +37,10 @@ public class InstantiationTests {
final Property name = personMapping.getProperty( "name" ); final Property name = personMapping.getProperty( "name" );
final Component nameMapping = (Component) name.getValue(); final Component nameMapping = (Component) name.getValue();
assertThat( nameMapping.getPropertySpan() ).isEqualTo( 2 ); assertThat( nameMapping.getPropertySpan() ).isEqualTo( 2 );
final Property aliases = personMapping.getProperty( "aliases" );
final Component aliasMapping = (Component) ( (Collection) aliases.getValue() ).getElement();
assertThat( aliasMapping.getPropertySpan() ).isEqualTo( 2 );
}); });
} }

View File

@ -6,17 +6,10 @@
*/ */
package org.hibernate.orm.test.mapping.embeddable.strategy.instantiator.intf; package org.hibernate.orm.test.mapping.embeddable.strategy.instantiator.intf;
import jakarta.persistence.Basic;
import jakarta.persistence.Embeddable;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
@Embeddable
public interface Name { public interface Name {
@Basic
String getFirstName(); String getFirstName();
@Basic
String getLastName(); String getLastName();
} }

View File

@ -11,6 +11,8 @@ import java.util.Set;
import org.hibernate.annotations.EmbeddableInstantiator; import org.hibernate.annotations.EmbeddableInstantiator;
import jakarta.persistence.Access;
import jakarta.persistence.AccessType;
import jakarta.persistence.ElementCollection; import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embedded; import jakarta.persistence.Embedded;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
@ -24,12 +26,16 @@ import jakarta.persistence.Table;
public class Person { public class Person {
@Id @Id
public Integer id; public Integer id;
@Embedded @Embedded
@EmbeddableInstantiator( NameInstantiator.class ) @EmbeddableInstantiator( NameInstantiator.class )
@Access( AccessType.PROPERTY )
public Name name; public Name name;
@ElementCollection @ElementCollection
@Embedded @Embedded
@EmbeddableInstantiator( NameInstantiator.class ) @EmbeddableInstantiator( NameInstantiator.class )
@Access( AccessType.PROPERTY )
public Set<Name> aliases; public Set<Name> aliases;
//end::embeddable-instantiator-property[] //end::embeddable-instantiator-property[]

View File

@ -12,6 +12,8 @@ import org.hibernate.mapping.Property;
import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.DomainModelScope; 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.SessionFactory;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -28,6 +30,8 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
@DomainModel( annotatedClasses = { Person.class, Name.class } ) @DomainModel( annotatedClasses = { Person.class, Name.class } )
@SessionFactory @SessionFactory
@NotImplementedYet( reason = "Hibernate requires setter" )
@JiraKey( "HHH-14950" )
public class InstantiationTests { public class InstantiationTests {
@Test @Test
public void modelTest(DomainModelScope scope) { public void modelTest(DomainModelScope scope) {