Skip to content

Commit

Permalink
Re-enabled additional tests and fixed inheritance issues
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed Sep 21, 2020
1 parent c7dd682 commit 59f902f
Show file tree
Hide file tree
Showing 15 changed files with 137 additions and 87 deletions.
Expand Up @@ -6520,11 +6520,11 @@ public void visitFetchables(
}

//noinspection unchecked
attributeMappings.forEach( (Consumer) fetchableConsumer );
attributeMappings.forEach( fetchableConsumer );

if ( treatTargetType.isTypeOrSuperType( this ) ) {
visitSubTypeAttributeMappings(
attributeMapping -> fetchableConsumer.accept( (Fetchable) attributeMapping )
attributeMapping -> fetchableConsumer.accept( attributeMapping )
);
}
}
Expand Down
Expand Up @@ -217,6 +217,14 @@ public UnionSubclassEntityPersister(
postConstruct( creationContext.getMetadata() );
}

@Override
public boolean containsTableReference(String tableExpression) {
if ( tableName.equals( tableExpression ) ) {
return true;
}
return super.containsTableReference( tableExpression );
}

@Override
public TableGroup createRootTableGroup(
NavigablePath navigablePath,
Expand Down
Expand Up @@ -109,8 +109,10 @@ public TableReference getTableReferenceInternal(String tableExpression) {
for ( int i = 0; i < tableJoins.size(); i++ ) {
final TableReferenceJoin join = tableJoins.get( i );
assert join != null;
if ( join.getJoinedTableReference().getTableExpression().equals( tableExpression ) ) {
return join.getJoinedTableReference();
final TableReference resolveTableReference = join.getJoinedTableReference()
.getTableReference( tableExpression );
if ( resolveTableReference != null ) {
return resolveTableReference;
}
}
}
Expand Down
Expand Up @@ -16,7 +16,7 @@
*
* @author Steve Ebersole
*/
public interface FetchParentAccess {
public interface FetchParentAccess extends Initializer {
FetchParentAccess findFirstEntityDescriptorAccess();

Object getParentKey();
Expand Down
Expand Up @@ -14,7 +14,7 @@
/**
* @author Steve Ebersole
*/
public interface EmbeddableInitializer extends Initializer, FetchParentAccess {
public interface EmbeddableInitializer extends FetchParentAccess {
@Override
EmbeddableValuedModelPart getInitializedPart();

Expand Down
Expand Up @@ -333,7 +333,7 @@ private EntityPersister determineConcreteEntityDescriptor(
// entityKey.getIdentifier(),
// entityDescriptor.getEntityName()
// );
return null;
return entityDescriptor;
}

final EntityPersister concreteType = session.getFactory().getMetamodel().findEntityDescriptor( concreteEntityName );
Expand Down Expand Up @@ -773,6 +773,11 @@ private void postLoad(RowProcessingState rowProcessingState) {
}
}

@Override
public EntityPersister getConcreteDescriptor() {
return concreteDescriptor;
}

@Override
public void finishUpRow(RowProcessingState rowProcessingState) {
// reset row state
Expand Down
Expand Up @@ -6,25 +6,24 @@
*/
package org.hibernate.sql.results.graph.entity;

import org.hibernate.LockMode;
import org.hibernate.engine.spi.EntityKey;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.persister.entity.EntityPersister;

/**
* Initializer implementation for initializing entity references.
*
* @author Steve Ebersole
*/
public interface EntityInitializer extends Initializer, FetchParentAccess {
public interface EntityInitializer extends FetchParentAccess {

/**
* Get the descriptor for the type of entity being initialized
*/
EntityPersister getEntityDescriptor();

EntityPersister getConcreteDescriptor();

@Override
default FetchParentAccess findFirstEntityDescriptorAccess() {
return this;
Expand Down
Expand Up @@ -157,6 +157,11 @@ public void registerResolutionListener(Consumer<Object> listener) {
}
}

@Override
public EntityPersister getConcreteDescriptor() {
return getEntityDescriptor();
}

@Override
public String toString() {
return "EntityDelayedFetchInitializer(" + LoggingHelper.toLoggableString( navigablePath ) + ")";
Expand Down
Expand Up @@ -63,6 +63,7 @@ public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, Ass

if ( selectByUniqueKey ) {
return new EntitySelectFetchByUniqueKeyInitializer(
parentAccess,
getFetchedMapping(),
(ToOneAttributeMapping) getFetchedMapping(),
getNavigablePath(),
Expand All @@ -72,6 +73,7 @@ public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, Ass
);
}
return new EntitySelectFetchInitializer(
parentAccess,
getFetchedMapping(),
getNavigablePath(),
entityPersister,
Expand Down
Expand Up @@ -15,6 +15,7 @@
import org.hibernate.persister.entity.UniqueKeyLoadable;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;

/**
Expand All @@ -24,13 +25,14 @@ public class EntitySelectFetchByUniqueKeyInitializer extends EntitySelectFetchIn
private final ToOneAttributeMapping fetchedAttribute;

public EntitySelectFetchByUniqueKeyInitializer(
FetchParentAccess parentAccess,
EntityValuedModelPart referencedModelPart,
ToOneAttributeMapping fetchedAttribute,
NavigablePath fetchedNavigable,
EntityPersister concreteDescriptor,
DomainResultAssembler identifierAssembler,
boolean nullable) {
super( referencedModelPart, fetchedNavigable, concreteDescriptor, identifierAssembler, nullable );
super( parentAccess, referencedModelPart, fetchedNavigable, concreteDescriptor, identifierAssembler, nullable );
this.fetchedAttribute = fetchedAttribute;
}

Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.sql.results.graph.entity.internal;

import java.util.Collection;
import java.util.function.Consumer;

import org.hibernate.NotYetImplementedFor6Exception;
Expand All @@ -14,18 +15,19 @@
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.log.LoggingHelper;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.mapping.AttributeMapping;
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.query.NavigablePath;
import org.hibernate.sql.results.graph.AbstractFetchParentAccess;
import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Initializer;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
import org.hibernate.sql.results.graph.entity.EntityInitializer;
import org.hibernate.sql.results.graph.entity.EntityLoadingLogger;
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
import org.hibernate.sql.results.graph.entity.EntityValuedFetchable;
import org.hibernate.sql.results.graph.entity.LoadingEntityEntry;
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;

Expand All @@ -37,6 +39,7 @@
public class EntitySelectFetchInitializer extends AbstractFetchParentAccess implements EntityInitializer {
private static final String CONCRETE_NAME = EntitySelectFetchInitializer.class.getSimpleName();

private FetchParentAccess parentAccess;
private final NavigablePath navigablePath;
private final boolean isEnhancedForLazyLoading;
private final boolean nullable;
Expand All @@ -48,11 +51,13 @@ public class EntitySelectFetchInitializer extends AbstractFetchParentAccess impl
protected Object entityInstance;

public EntitySelectFetchInitializer(
FetchParentAccess parentAccess,
EntityValuedModelPart referencedModelPart,
NavigablePath fetchedNavigable,
EntityPersister concreteDescriptor,
DomainResultAssembler identifierAssembler,
boolean nullable) {
this.parentAccess = parentAccess;
this.navigablePath = fetchedNavigable;
this.concreteDescriptor = concreteDescriptor;
this.identifierAssembler = identifierAssembler;
Expand Down Expand Up @@ -81,6 +86,20 @@ public void resolveInstance(RowProcessingState rowProcessingState) {

@Override
public void initializeInstance(RowProcessingState rowProcessingState) {
Collection<AttributeMapping> attributeMappings;
if ( parentAccess instanceof EmbeddableInitializer ) {
attributeMappings = ( (EmbeddableInitializer) parentAccess ).getInitializedPart()
.getEmbeddableTypeDescriptor()
.getAttributeMappings();
}
else {
attributeMappings = ( (EntityInitializer) parentAccess ).getConcreteDescriptor().getAttributeMappings();
}

if ( !attributeMappings.contains( referencedModelPart ) ) {
return;
}

if ( entityInstance != null ) {
return;
}
Expand Down Expand Up @@ -227,6 +246,11 @@ public void registerResolutionListener(Consumer<Object> listener) {
}
}

@Override
public EntityPersister getConcreteDescriptor() {
return concreteDescriptor;
}

@Override
public String toString() {
return "EntitySelectFetchInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
Expand Down
Expand Up @@ -106,6 +106,7 @@ public DomainResultAssembler createAssembler(
() -> {
if ( timing == FetchTiming.IMMEDIATE ) {
return new EntitySelectFetchInitializer(
parentAccess,
referencedModelPart,
getReferencedPath(),
entityMappingType.getEntityPersister(),
Expand Down
Expand Up @@ -4,8 +4,15 @@
* 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.inheritance.discriminator.embeddable;
package org.hibernate.orm.test.inheritance.discriminator.embeddable;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.CollectionTable;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
Expand All @@ -22,48 +29,42 @@
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;

import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.Test;

/**
* @author Andrea Boriero
*/
@TestForIssue(jiraKey = "HHH-11037")
public class JoinedSubclassWithEmbeddableTest extends BaseCoreFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {Person.class, Employee.class};
}
@DomainModel(
annotatedClasses = {
JoinedSubclassWithEmbeddableTest.Person.class, JoinedSubclassWithEmbeddableTest.Employee.class
}
)
@SessionFactory
public class JoinedSubclassWithEmbeddableTest {

@Test
public void testSelectFromEmbeddedField() {
doInHibernate( this::sessionFactory, session -> {
public void testSelectFromEmbeddedField(SessionFactoryScope scope) {
scope.inTransaction( session -> {
session.createNativeQuery( "select * from employee_emb_person_map" ).getResultList();
} );
}

@Test
public void testSelectFromSubclass() {
doInHibernate( this::sessionFactory, session -> {
public void testSelectFromSubclass(SessionFactoryScope scope) {
scope.inTransaction( session -> {
session.createNativeQuery( "select * from embeddable_person_map" ).getResultList();
} );
}

@Test
public void testSelectFromParent() {
doInHibernate( this::sessionFactory, session -> {
public void testSelectFromParent(SessionFactoryScope scope) {
scope.inTransaction( session -> {
session.createNativeQuery( "select * from person_map" ).getResultList();
} );
}
Expand Down

0 comments on commit 59f902f

Please sign in to comment.