Joined inheritance work - fixed issue

This commit is contained in:
Andrea Boriero 2019-11-11 12:20:23 +00:00
parent e0dd8321f3
commit 895cc3f529
9 changed files with 77 additions and 40 deletions

View File

@ -1259,22 +1259,21 @@ private CaseSearchedExpressionInfo getCaseSearchedExpression(TableGroup entityTa
final BasicType discriminatorType = (BasicType) getDiscriminatorType();
final CaseSearchedExpression caseSearchedExpression = new CaseSearchedExpression( discriminatorType );
tableReferenceJoins.forEach(
tableReferenceJoin -> {
final TableReference joinedTableReference = tableReferenceJoin.getJoinedTableReference();
if ( discriminatorValuesByTableName.containsKey( joinedTableReference.getTableExpression() ) ) {
final ColumnReference identifierColumnReference = getIdentifierColumnReference(
joinedTableReference );
info.columnReferences.add( identifierColumnReference );
addWhen(
caseSearchedExpression,
joinedTableReference,
identifierColumnReference,
discriminatorType
);
}
}
);
for ( int i = tableReferenceJoins.size() - 1; i >= 0; i-- ) {
final TableReferenceJoin tableReferenceJoin = tableReferenceJoins.get( i );
final TableReference joinedTableReference = tableReferenceJoin.getJoinedTableReference();
if ( discriminatorValuesByTableName.containsKey( joinedTableReference.getTableExpression() ) ) {
final ColumnReference identifierColumnReference = getIdentifierColumnReference(
joinedTableReference );
info.columnReferences.add( identifierColumnReference );
addWhen(
caseSearchedExpression,
joinedTableReference,
identifierColumnReference,
discriminatorType
);
}
}
addWhen(
caseSearchedExpression,

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping;
package org.hibernate.orm.test.metamodel.mapping.inheritance;
import javax.persistence.Entity;
import javax.persistence.Id;

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping;
package org.hibernate.orm.test.metamodel.mapping.inheritance;
import java.util.List;
import javax.persistence.DiscriminatorColumn;

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping.joined;
package org.hibernate.orm.test.metamodel.mapping.inheritance.joined;
import java.sql.Statement;
import java.util.List;

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping.joined;
package org.hibernate.orm.test.metamodel.mapping.inheritance.joined;
import java.sql.Statement;
import java.util.List;

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping.joined;
package org.hibernate.orm.test.metamodel.mapping.inheritance.joined;
import java.sql.Statement;
import java.util.List;
@ -33,6 +33,7 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
@ -43,7 +44,7 @@
MixedInheritanceTest.Customer.class,
MixedInheritanceTest.DomesticCustomer.class,
MixedInheritanceTest.ForeignCustomer.class,
MixedInheritanceTest.ItalianForeignCustomer.class
MixedInheritanceTest.ItalianCustomer.class
}
)
@ServiceRegistry
@ -64,6 +65,10 @@ public void basicTest(SessionFactoryScope scope) {
.getMetamodel()
.findEntityDescriptor( ForeignCustomer.class );
final EntityPersister italianCustomerDescriptor = scope.getSessionFactory()
.getMetamodel()
.findEntityDescriptor( ItalianCustomer.class );
assert customerDescriptor instanceof JoinedSubclassEntityPersister;
assert customerDescriptor.isTypeOrSuperType( customerDescriptor );
@ -81,6 +86,12 @@ public void basicTest(SessionFactoryScope scope) {
assert foreignCustomerDescriptor.isTypeOrSuperType( customerDescriptor );
assert !foreignCustomerDescriptor.isTypeOrSuperType( domesticCustomerDescriptor );
assert foreignCustomerDescriptor.isTypeOrSuperType( foreignCustomerDescriptor );
assert italianCustomerDescriptor instanceof JoinedSubclassEntityPersister;
assert italianCustomerDescriptor.isTypeOrSuperType( customerDescriptor );
assert !italianCustomerDescriptor.isTypeOrSuperType( domesticCustomerDescriptor );
assert italianCustomerDescriptor.isTypeOrSuperType( foreignCustomerDescriptor );
}
@Test
@ -94,27 +105,37 @@ public void rootQueryExecutionTest(SessionFactoryScope scope) {
Customer.class
).list();
assertThat( results.size(), is( 2 ) );
assertThat( results.size(), is( 3 ) );
boolean foundDomesticCustomer = false;
boolean foundForeignCustomer = false;
boolean foundItalianCustomer = false;
for ( Customer result : results ) {
if ( result.getId() == 1 ) {
assertThat( result, instanceOf( DomesticCustomer.class ) );
final DomesticCustomer customer = (DomesticCustomer) result;
assertThat( customer.getName(), is( "domestic" ) );
assertThat( ( customer ).getTaxId(), is( "123" ) );
assertThat( customer.getTaxId(), is( "123" ) );
foundDomesticCustomer = true;
}
else {
else if ( result.getId() == 2 ) {
assertThat( result.getId(), is( 2 ) );
final ForeignCustomer customer = (ForeignCustomer) result;
assertThat( customer.getName(), is( "foreign" ) );
assertThat( ( customer ).getVat(), is( "987" ) );
assertThat( customer.getVat(), is( "987" ) );
foundForeignCustomer = true;
}
else {
assertThat( result.getId(), is( 3 ) );
final ItalianCustomer customer = (ItalianCustomer) result;
assertThat( customer.getName(), is( "italian" ) );
assertThat( customer.getVat(), is( "100" ) );
assertThat( customer.getCode(), is( "IT" ) );
foundItalianCustomer = true;
}
}
assertTrue( foundDomesticCustomer );
assertTrue( foundForeignCustomer );
assertTrue( foundItalianCustomer );
}
}
);
@ -137,15 +158,30 @@ public void subclassQueryExecutionTest(SessionFactoryScope scope) {
}
{
final ForeignCustomer result = session.createQuery(
final List<ForeignCustomer> results = session.createQuery(
"select c from ForeignCustomer c",
ForeignCustomer.class
).uniqueResult();
).list();
assertEquals( results.size(), 2 );
for ( ForeignCustomer foreignCustomer : results ) {
if ( foreignCustomer.getId() == 2 ) {
assertTrue( foreignCustomer instanceof ForeignCustomer );
assertThat( foreignCustomer.getName(), is( "foreign" ) );
assertThat( foreignCustomer.getVat(), is( "987" ) );
}
else {
assertTrue( foreignCustomer instanceof ItalianCustomer );
ItalianCustomer italianCustomer = (ItalianCustomer) foreignCustomer;
assertThat( italianCustomer.getId(), is( 3 ) );
assertThat( italianCustomer.getName(), is( "italian" ) );
assertThat( italianCustomer.getVat(), is( "100" ) );
assertThat( italianCustomer.getCode(), is( "IT" ) );
}
}
assertThat( result, notNullValue() );
assertThat( result.getId(), is( 2 ) );
assertThat( result.getName(), is( "foreign" ) );
assertThat( result.getVat(), is( "987" ) );
}
}
);
@ -157,6 +193,7 @@ public void createTestData(SessionFactoryScope scope) {
session -> {
session.persist( new DomesticCustomer( 1, "domestic", "123" ) );
session.persist( new ForeignCustomer( 2, "foreign", "987" ) );
session.persist( new ItalianCustomer( 3, "italian", "100", "IT" ) );
}
);
}
@ -170,6 +207,7 @@ public void cleanupTestData(SessionFactoryScope scope) {
Statement statement = work.createStatement();
try {
statement.execute( "delete from DomesticCustomer" );
statement.execute( "delete from ItalianCustomer" );
statement.execute( "delete from ForeignCustomer" );
statement.execute( "delete from Customer" );
}
@ -240,7 +278,7 @@ public void setTaxId(String taxId) {
@Entity(name = "ForeignCustomer")
@Table(name = "ForeignCustomer")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name = "cust_type" )
@DiscriminatorColumn(name = "cust_type")
@DiscriminatorValue("FC")
public static class ForeignCustomer extends Customer {
private String vat;
@ -262,15 +300,15 @@ public void setVat(String vat) {
}
}
@Entity(name = "ItalianForeignCustomer")
@Entity(name = "ItalianCustomer")
@DiscriminatorValue("IFC")
public static class ItalianForeignCustomer extends ForeignCustomer{
public static class ItalianCustomer extends ForeignCustomer {
private String code;
public ItalianForeignCustomer() {
public ItalianCustomer() {
}
public ItalianForeignCustomer(Integer id, String name, String vat, String code) {
public ItalianCustomer(Integer id, String name, String vat, String code) {
super( id, name, vat );
this.code = code;
}

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping;
package org.hibernate.orm.test.metamodel.mapping.inheritance.tableperclass;
import java.util.List;
import javax.persistence.DiscriminatorColumn;

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping;
package org.hibernate.orm.test.metamodel.mapping.inheritance.tableperclass;
import java.util.List;
import javax.persistence.Entity;

View File

@ -4,7 +4,7 @@
* 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.metamodel.mapping;
package org.hibernate.orm.test.metamodel.mapping.inheritance.tableperclass;
import java.util.List;
import javax.persistence.Entity;