HHH-18172 Add test for issue
This commit is contained in:
parent
d54f71f81c
commit
547fe55ecc
|
@ -0,0 +1,218 @@
|
|||
/*
|
||||
* 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.orm.test.inheritance.embeddable;
|
||||
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.Jira;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.DiscriminatorValue;
|
||||
import jakarta.persistence.Embeddable;
|
||||
import jakarta.persistence.Embedded;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.MappedSuperclass;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author Marco Belladelli
|
||||
*/
|
||||
@DomainModel( annotatedClasses = {
|
||||
EmbeddableInheritanceMappedSuperclassAdnGenericsTest.AbstractSuperclass.class,
|
||||
EmbeddableInheritanceMappedSuperclassAdnGenericsTest.Range.class,
|
||||
EmbeddableInheritanceMappedSuperclassAdnGenericsTest.IntegerRange.class,
|
||||
EmbeddableInheritanceMappedSuperclassAdnGenericsTest.ToleranceRange.class,
|
||||
EmbeddableInheritanceMappedSuperclassAdnGenericsTest.TestEntity.class,
|
||||
} )
|
||||
@SessionFactory
|
||||
@Jira( "https://hibernate.atlassian.net/browse/HHH-18172" )
|
||||
public class EmbeddableInheritanceMappedSuperclassAdnGenericsTest {
|
||||
@Test
|
||||
public void testFind(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
final TestEntity entity = session.find( TestEntity.class, 1L );
|
||||
assertThat( entity.getRange().getName() ).isEqualTo( "tolerance_range" );
|
||||
assertThat( entity.getRange() ).isExactlyInstanceOf( ToleranceRange.class );
|
||||
assertThat( ( (ToleranceRange) entity.getRange() ).getTolerance() ).isEqualTo( 2 );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryEntity(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
final TestEntity entity = session.createQuery(
|
||||
"from TestEntity where id = 2",
|
||||
TestEntity.class
|
||||
).getSingleResult();
|
||||
assertThat( entity.getRange().getName() ).isEqualTo( "integer_range" );
|
||||
assertThat( entity.getRange() ).isExactlyInstanceOf( IntegerRange.class );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryEmbeddable(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
final IntegerRange result = session.createQuery(
|
||||
"select range from TestEntity where id = 1",
|
||||
IntegerRange.class
|
||||
).getSingleResult();
|
||||
assertThat( result.getName() ).isEqualTo( "tolerance_range" );
|
||||
assertThat( result ).isExactlyInstanceOf( ToleranceRange.class );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryJoinedEmbeddable(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
final IntegerRange result = session.createQuery(
|
||||
"select r from TestEntity t join t.range r where id = 2",
|
||||
IntegerRange.class
|
||||
).getSingleResult();
|
||||
assertThat( result.getName() ).isEqualTo( "integer_range" );
|
||||
assertThat( result ).isExactlyInstanceOf( IntegerRange.class );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdate(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
final IntegerRange range = new IntegerRange();
|
||||
range.setName( "new_range" );
|
||||
range.setMin( 1 );
|
||||
range.setMin( 2 );
|
||||
final TestEntity entity = new TestEntity( 3L, range );
|
||||
session.persist( entity );
|
||||
session.flush();
|
||||
entity.getRange().setName( "updated_range" );
|
||||
entity.getRange().setMax( 3 );
|
||||
} );
|
||||
scope.inTransaction( session -> {
|
||||
final TestEntity entity = session.find( TestEntity.class, 3L );
|
||||
assertThat( entity.getRange().getName() ).isEqualTo( "updated_range" );
|
||||
assertThat( entity.getRange().getMax() ).isEqualTo( 3 );
|
||||
final ToleranceRange tolerance = new ToleranceRange();
|
||||
tolerance.setName( "new_tolerance" );
|
||||
tolerance.setMin( 10 );
|
||||
tolerance.setMax( 20 );
|
||||
tolerance.setTolerance( 4 );
|
||||
entity.setRange( tolerance );
|
||||
} );
|
||||
scope.inTransaction( session -> assertThat( session.find( TestEntity.class, 3L ).getRange() )
|
||||
.isExactlyInstanceOf( ToleranceRange.class )
|
||||
.extracting( AbstractSuperclass::getName ).isEqualTo( "new_tolerance" ) );
|
||||
}
|
||||
|
||||
@BeforeAll
|
||||
public void setUp(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
final ToleranceRange range1 = new ToleranceRange();
|
||||
range1.setName( "tolerance_range" );
|
||||
range1.setMin( 1 );
|
||||
range1.setMax( 10 );
|
||||
range1.setTolerance( 2 );
|
||||
session.persist( new TestEntity( 1L, range1 ) );
|
||||
final IntegerRange range2 = new IntegerRange();
|
||||
range2.setName( "integer_range" );
|
||||
range2.setMin( 10 );
|
||||
range2.setMax( 20 );
|
||||
session.persist( new TestEntity( 2L, range2 ) );
|
||||
} );
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> session.createMutationQuery( "delete from TestEntity" ).executeUpdate() );
|
||||
}
|
||||
|
||||
@MappedSuperclass
|
||||
static abstract class AbstractSuperclass {
|
||||
private String name;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
@DiscriminatorValue( "range" )
|
||||
static class Range<T> extends AbstractSuperclass {
|
||||
@Column( name = "min_col" )
|
||||
private T min;
|
||||
@Column( name = "max_col" )
|
||||
private T max;
|
||||
|
||||
public T getMin() {
|
||||
return min;
|
||||
}
|
||||
|
||||
public void setMin(T min) {
|
||||
this.min = min;
|
||||
}
|
||||
|
||||
public T getMax() {
|
||||
return max;
|
||||
}
|
||||
|
||||
public void setMax(T max) {
|
||||
this.max = max;
|
||||
}
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
@DiscriminatorValue( "integer" )
|
||||
static class IntegerRange extends Range<Integer> {
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
@DiscriminatorValue( "tolerance" )
|
||||
static class ToleranceRange extends IntegerRange {
|
||||
private Integer tolerance;
|
||||
|
||||
public Integer getTolerance() {
|
||||
return tolerance;
|
||||
}
|
||||
|
||||
public void setTolerance(Integer tolerance) {
|
||||
this.tolerance = tolerance;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity( name = "TestEntity" )
|
||||
static class TestEntity {
|
||||
@Id
|
||||
private Long id;
|
||||
|
||||
@Embedded
|
||||
private Range<Integer> range;
|
||||
|
||||
public TestEntity() {
|
||||
}
|
||||
|
||||
public TestEntity(Long id, Range<Integer> range) {
|
||||
this.id = id;
|
||||
this.range = range;
|
||||
}
|
||||
|
||||
public Range<Integer> getRange() {
|
||||
return range;
|
||||
}
|
||||
|
||||
public void setRange(Range<Integer> range) {
|
||||
this.range = range;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue