Given the model
{code:java}@MappedSuperclass public static class Edition<T> { private String editorName;
@Column(name = "CODE_COLUMN") private T code;
public Edition() { }
public Edition(String editorName, T code) { this.editorName = editorName; this.code = code; } }
@Embeddable public static class RareEdition extends Edition<Integer> {
private String state;
public RareEdition() { }
public RareEdition(String editorName, Integer code, String state) { super( editorName, code ); this.state = state; } }
@Embeddable public static class PopularEdition extends Edition<String> {
@Column(name = "YEAR_COLUMN") private Integer year;
public PopularEdition() { }
public PopularEdition(String editorName, String code, Integer year) { super( editorName, code ); this.year = year; } }
@Entity(name = "Base") @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public static class Base { @Id private Long id;
public Base() { }
public Base(Long id) { this.id = id; } }
@MappedSuperclass public static abstract class Book<T extends Edition> extends Base { @Embedded private T edition;
public Book() { }
public Book(Long id, T edition) { super( id ); this.edition = edition; } }
@Entity(name = "PopularBook") public static class PopularBook extends Book<PopularEdition> {
public PopularBook() { }
public PopularBook(Long id, PopularEdition edition) { super( id, edition ); } }
@Entity(name = "RareBook") public static class RareBook extends Book<RareEdition> {
public RareBook() { }
public RareBook(Long id, RareEdition edition) { super( id, edition ); }
}{code}
the following test fails
{code:java}@Test @FailureExpected(jiraKey = "", reason = "Parametrized Embedded Subclasses not supported") public void testSelectSpecificEmbeddedAttribute(SessionFactoryScope scope) { scope.inTransaction( session -> { List<String> rareBookCodes = session.createQuery( "select b.edition.state from RareBook b where b.id = :id", String.class ).setParameter( "id", RARE_BOOK_ID ).list();
assertThat( rareBookCodes.size() ).isEqualTo( 1 );
String code = rareBookCodes.get( 0 ); assertThat( code ).isEqualTo( RARE_BOOK_STATE ); } );
scope.inTransaction( session -> { List<Integer> populareBookCodes = session.createQuery( "select b.edition.year from PopularBook b where b.id = :id", Integer.class ).setParameter( "id", POPULAR_BOOK_ID ).list();
assertThat( populareBookCodes.size() ).isEqualTo( 1 );
Integer code = populareBookCodes.get( 0 ); assertThat( code ).isEqualTo( POPULAR_BOOK_YEAR ); } ); } {code}
[Test case|https://github.com/hibernate/hibernate-orm/pull/5358] |
|