/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.joinedsubclass; import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.junit.Before; import org.junit.Test; import static org.hamcrest.core.Is.is; import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; import static org.junit.Assert.assertThat; /** * @author Andrea Boriero */ public class JoinedSubclassWithEmbeddableTest extends BaseCoreFunctionalTestCase { @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {BaseEntity.class, ConcreteEntity.class}; } @Before public void setUp() { doInHibernate( this::sessionFactory, session -> { ConcreteEntity entity = new ConcreteEntity(); entity.setId( 1L ); entity.setField( "field_base" ); EmbeddedValue embeddedValue = new EmbeddedValue(); embeddedValue.setField( "field_embedded" ); entity.setEmbedded( embeddedValue ); session.persist( entity ); } ); } @Test @TestForIssue(jiraKey = "HHH-10920") public void testEmbeddedFieldIsNotNull() { doInHibernate( this::sessionFactory, session -> { final ConcreteEntity entity = session.get( ConcreteEntity.class, 1L ); assertThat( entity.getEmbedded().getField(), is( "field_embedded" ) ); assertThat( entity.getField(), is( "field_base" ) ); entity.getEmbedded().setField( "field_subclass" ); } ); doInHibernate( this::sessionFactory, session -> { final ConcreteEntity entity = session.get( ConcreteEntity.class, 1L ); assertThat( entity.getEmbedded().getField(), is( "field_subclass" ) ); assertThat( entity.getField(), is( "field_base" ) ); } ); } @Entity(name = "BaseEntity") @Inheritance(strategy = InheritanceType.JOINED) public static abstract class BaseEntity { @Id private Long id; private String field; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getField() { return field; } public void setField(String field) { this.field = field; } } @Entity(name = "ConcreteEntity") public static class ConcreteEntity extends BaseEntity { private EmbeddedValue embeddedValue; public EmbeddedValue getEmbedded() { return embeddedValue; } public void setEmbedded(EmbeddedValue embeddedValue) { this.embeddedValue = embeddedValue; } } @Embeddable public static class EmbeddedValue { private String field; public String getField() { return field; } public void setField(String field) { this.field = field; } } }