mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-03-03 08:19:15 +00:00
Joined inheritance work - fixed issue
This commit is contained in:
parent
e0dd8321f3
commit
895cc3f529
@ -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,
|
||||
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
||||
}
|
@ -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;
|
@ -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;
|
@ -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;
|
Loading…
x
Reference in New Issue
Block a user