HHH-8077 - Add MDC usage into attribute walking to help decode logs from recursive calls
This commit is contained in:
parent
6ea20fa308
commit
87012e8101
|
@ -249,7 +249,7 @@ public final class Cascade {
|
||||||
// orphaned value, something a delete with a subquery to
|
// orphaned value, something a delete with a subquery to
|
||||||
// match the owner.
|
// match the owner.
|
||||||
// final EntityType entityType = (EntityType) type;
|
// final EntityType entityType = (EntityType) type;
|
||||||
// final String propertyPath = composePropertyPath( entityType.getPropertyName() );
|
// final String getPropertyPath = composePropertyPath( entityType.getPropertyName() );
|
||||||
loadedValue = null;
|
loadedValue = null;
|
||||||
}
|
}
|
||||||
if ( loadedValue != null ) {
|
if ( loadedValue != null ) {
|
||||||
|
|
|
@ -141,7 +141,7 @@ public class DotNode extends FromReferenceNode implements DisplayableNode, Selec
|
||||||
FromElement fromElement = getFromElement();
|
FromElement fromElement = getFromElement();
|
||||||
buf.append( "{propertyName=" ).append( propertyName );
|
buf.append( "{propertyName=" ).append( propertyName );
|
||||||
buf.append( ",dereferenceType=" ).append( getWalker().getASTPrinter().getTokenTypeName( dereferenceType ) );
|
buf.append( ",dereferenceType=" ).append( getWalker().getASTPrinter().getTokenTypeName( dereferenceType ) );
|
||||||
buf.append( ",propertyPath=" ).append( propertyPath );
|
buf.append( ",getPropertyPath=" ).append( propertyPath );
|
||||||
buf.append( ",path=" ).append( getPath() );
|
buf.append( ",path=" ).append( getPath() );
|
||||||
if ( fromElement != null ) {
|
if ( fromElement != null ) {
|
||||||
buf.append( ",tableAlias=" ).append( fromElement.getTableAlias() );
|
buf.append( ",tableAlias=" ).append( fromElement.getTableAlias() );
|
||||||
|
@ -585,7 +585,7 @@ public class DotNode extends FromReferenceNode implements DisplayableNode, Selec
|
||||||
LOG.debugf( "Unresolved property path is now '%s'", dotNode.propertyPath );
|
LOG.debugf( "Unresolved property path is now '%s'", dotNode.propertyPath );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG.debugf( "Terminal propertyPath = [%s]", propertyPath );
|
LOG.debugf( "Terminal getPropertyPath = [%s]", propertyPath );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -295,13 +295,13 @@ class FromElementType {
|
||||||
*
|
*
|
||||||
* @param propertyName The last part of the full path to the property.
|
* @param propertyName The last part of the full path to the property.
|
||||||
* @return The type.
|
* @return The type.
|
||||||
* @0param propertyPath The full property path.
|
* @0param getPropertyPath The full property path.
|
||||||
*/
|
*/
|
||||||
public Type getPropertyType(String propertyName, String propertyPath) {
|
public Type getPropertyType(String propertyName, String propertyPath) {
|
||||||
checkInitialized();
|
checkInitialized();
|
||||||
Type type = null;
|
Type type = null;
|
||||||
// If this is an entity and the property is the identifier property, then use getIdentifierType().
|
// If this is an entity and the property is the identifier property, then use getIdentifierType().
|
||||||
// Note that the propertyName.equals( propertyPath ) checks whether we have a component
|
// Note that the propertyName.equals( getPropertyPath ) checks whether we have a component
|
||||||
// key reference, where the component class property name is the same as the
|
// key reference, where the component class property name is the same as the
|
||||||
// entity id property name; if the two are not equal, this is the case and
|
// entity id property name; if the two are not equal, this is the case and
|
||||||
// we'd need to "fall through" to using the property mapping.
|
// we'd need to "fall through" to using the property mapping.
|
||||||
|
|
|
@ -72,11 +72,11 @@ public abstract class AbstractCollectionReference extends AbstractPlanNode imple
|
||||||
final Type type = persister.getIndexType();
|
final Type type = persister.getIndexType();
|
||||||
if ( type.isAssociationType() ) {
|
if ( type.isAssociationType() ) {
|
||||||
if ( type.isEntityType() ) {
|
if ( type.isEntityType() ) {
|
||||||
return new EntityIndexGraph( sessionFactory(), this, propertyPath() );
|
return new EntityIndexGraph( sessionFactory(), this, getPropertyPath() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( type.isComponentType() ) {
|
else if ( type.isComponentType() ) {
|
||||||
return new CompositeIndexGraph( sessionFactory(), this, propertyPath() );
|
return new CompositeIndexGraph( sessionFactory(), this, getPropertyPath() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,17 +87,18 @@ public abstract class AbstractCollectionReference extends AbstractPlanNode imple
|
||||||
final Type type = persister.getElementType();
|
final Type type = persister.getElementType();
|
||||||
if ( type.isAssociationType() ) {
|
if ( type.isAssociationType() ) {
|
||||||
if ( type.isEntityType() ) {
|
if ( type.isEntityType() ) {
|
||||||
return new EntityElementGraph( sessionFactory(), this, propertyPath() );
|
return new EntityElementGraph( sessionFactory(), this, getPropertyPath() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( type.isComponentType() ) {
|
else if ( type.isComponentType() ) {
|
||||||
return new CompositeElementGraph( sessionFactory(), this, propertyPath() );
|
return new CompositeElementGraph( sessionFactory(), this, getPropertyPath() );
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PropertyPath propertyPath() {
|
@Override
|
||||||
|
public PropertyPath getPropertyPath() {
|
||||||
return propertyPath;
|
return propertyPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
import org.jboss.logging.MDC;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
|
@ -70,6 +71,7 @@ import static org.hibernate.loader.spi.ResultSetProcessingContext.IdentifierReso
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractLoadPlanBuilderStrategy implements LoadPlanBuilderStrategy, LoadPlanBuildingContext {
|
public abstract class AbstractLoadPlanBuilderStrategy implements LoadPlanBuilderStrategy, LoadPlanBuildingContext {
|
||||||
private static final Logger log = Logger.getLogger( AbstractLoadPlanBuilderStrategy.class );
|
private static final Logger log = Logger.getLogger( AbstractLoadPlanBuilderStrategy.class );
|
||||||
|
private static final String MDC_KEY = "hibernateLoadPlanWalkPath";
|
||||||
|
|
||||||
private final SessionFactoryImplementor sessionFactory;
|
private final SessionFactoryImplementor sessionFactory;
|
||||||
|
|
||||||
|
@ -103,10 +105,12 @@ public abstract class AbstractLoadPlanBuilderStrategy implements LoadPlanBuilder
|
||||||
"be sure to not use LoadPlanBuilderStrategy instances concurrently"
|
"be sure to not use LoadPlanBuilderStrategy instances concurrently"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
MDC.put( MDC_KEY, new MDCStack() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void finish() {
|
public void finish() {
|
||||||
|
MDC.remove( MDC_KEY );
|
||||||
fetchOwnerStack.clear();
|
fetchOwnerStack.clear();
|
||||||
collectionReferenceStack.clear();
|
collectionReferenceStack.clear();
|
||||||
}
|
}
|
||||||
|
@ -419,12 +423,18 @@ public abstract class AbstractLoadPlanBuilderStrategy implements LoadPlanBuilder
|
||||||
|
|
||||||
private void pushToStack(FetchOwner fetchOwner) {
|
private void pushToStack(FetchOwner fetchOwner) {
|
||||||
log.trace( "Pushing fetch owner to stack : " + fetchOwner );
|
log.trace( "Pushing fetch owner to stack : " + fetchOwner );
|
||||||
|
mdcStack().push( fetchOwner.getPropertyPath() );
|
||||||
fetchOwnerStack.addFirst( fetchOwner );
|
fetchOwnerStack.addFirst( fetchOwner );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MDCStack mdcStack() {
|
||||||
|
return (MDCStack) MDC.get( MDC_KEY );
|
||||||
|
}
|
||||||
|
|
||||||
private FetchOwner popFromStack() {
|
private FetchOwner popFromStack() {
|
||||||
final FetchOwner last = fetchOwnerStack.removeFirst();
|
final FetchOwner last = fetchOwnerStack.removeFirst();
|
||||||
log.trace( "Popped fetch owner from stack : " + last );
|
log.trace( "Popped fetch owner from stack : " + last );
|
||||||
|
mdcStack().pop();
|
||||||
if ( FetchStackAware.class.isInstance( last ) ) {
|
if ( FetchStackAware.class.isInstance( last ) ) {
|
||||||
( (FetchStackAware) last ).poppedFromStack();
|
( (FetchStackAware) last ).poppedFromStack();
|
||||||
}
|
}
|
||||||
|
@ -433,12 +443,14 @@ public abstract class AbstractLoadPlanBuilderStrategy implements LoadPlanBuilder
|
||||||
|
|
||||||
private void pushToCollectionStack(CollectionReference collectionReference) {
|
private void pushToCollectionStack(CollectionReference collectionReference) {
|
||||||
log.trace( "Pushing collection reference to stack : " + collectionReference );
|
log.trace( "Pushing collection reference to stack : " + collectionReference );
|
||||||
|
mdcStack().push( collectionReference.getPropertyPath() );
|
||||||
collectionReferenceStack.addFirst( collectionReference );
|
collectionReferenceStack.addFirst( collectionReference );
|
||||||
}
|
}
|
||||||
|
|
||||||
private CollectionReference popFromCollectionStack() {
|
private CollectionReference popFromCollectionStack() {
|
||||||
final CollectionReference last = collectionReferenceStack.removeFirst();
|
final CollectionReference last = collectionReferenceStack.removeFirst();
|
||||||
log.trace( "Popped collection reference from stack : " + last );
|
log.trace( "Popped collection reference from stack : " + last );
|
||||||
|
mdcStack().pop();
|
||||||
if ( FetchStackAware.class.isInstance( last ) ) {
|
if ( FetchStackAware.class.isInstance( last ) ) {
|
||||||
( (FetchStackAware) last ).poppedFromStack();
|
( (FetchStackAware) last ).poppedFromStack();
|
||||||
}
|
}
|
||||||
|
@ -722,4 +734,21 @@ public abstract class AbstractLoadPlanBuilderStrategy implements LoadPlanBuilder
|
||||||
return context.getSession().generateEntityKey( resolvedId, entityReference.getEntityPersister() );
|
return context.getSession().generateEntityKey( resolvedId, entityReference.getEntityPersister() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class MDCStack {
|
||||||
|
private ArrayDeque<PropertyPath> pathStack = new ArrayDeque<PropertyPath>();
|
||||||
|
|
||||||
|
public void push(PropertyPath path) {
|
||||||
|
pathStack.addFirst( path );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pop() {
|
||||||
|
pathStack.removeFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
final PropertyPath path = pathStack.peekFirst();
|
||||||
|
return path == null ? "<no-path>" : path.getFullPath();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,11 +80,6 @@ public class CollectionFetch extends AbstractCollectionReference implements Coll
|
||||||
return fetchStrategy;
|
return fetchStrategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public PropertyPath getPropertyPath() {
|
|
||||||
return propertyPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hydrate(ResultSet resultSet, ResultSetProcessingContext context) throws SQLException {
|
public void hydrate(ResultSet resultSet, ResultSetProcessingContext context) throws SQLException {
|
||||||
//To change body of implemented methods use File | Settings | File Templates.
|
//To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
|
|
@ -26,6 +26,7 @@ package org.hibernate.loader.plan.spi;
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.loader.CollectionAliases;
|
import org.hibernate.loader.CollectionAliases;
|
||||||
import org.hibernate.loader.EntityAliases;
|
import org.hibernate.loader.EntityAliases;
|
||||||
|
import org.hibernate.loader.PropertyPath;
|
||||||
import org.hibernate.persister.collection.CollectionPersister;
|
import org.hibernate.persister.collection.CollectionPersister;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,6 +60,8 @@ public interface CollectionReference {
|
||||||
|
|
||||||
public FetchOwner getElementGraph();
|
public FetchOwner getElementGraph();
|
||||||
|
|
||||||
|
public PropertyPath getPropertyPath();
|
||||||
|
|
||||||
public boolean hasEntityElements();
|
public boolean hasEntityElements();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,16 +1,47 @@
|
||||||
|
#
|
||||||
|
# Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
# indicated by the @author tags or express copyright attribution
|
||||||
|
# statements applied by the authors. All third-party contributions are
|
||||||
|
# distributed under license by Red Hat Inc.
|
||||||
|
#
|
||||||
|
# This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
# copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
# Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
# for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with this distribution; if not, write to:
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 51 Franklin Street, Fifth Floor
|
||||||
|
# Boston, MA 02110-1301 USA
|
||||||
|
#
|
||||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||||
log4j.appender.stdout.Target=System.out
|
log4j.appender.stdout.Target=System.out
|
||||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||||
|
#log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L (hibernateLoadPlanWalkPath->%X{hibernateLoadPlanWalkPath}) - %m%n
|
||||||
|
|
||||||
|
log4j.appender.stdout-mdc=org.apache.log4j.ConsoleAppender
|
||||||
|
log4j.appender.stdout-mdc.Target=System.out
|
||||||
|
log4j.appender.stdout-mdc.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.stdout-mdc.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L (walk path -> %X{hibernateLoadPlanWalkPath}) - %m%n
|
||||||
|
|
||||||
log4j.rootLogger=info, stdout
|
log4j.rootLogger=info, stdout
|
||||||
|
|
||||||
|
log4j.logger.org.hibernate.loader.plan=trace, stdout-mdc
|
||||||
|
log4j.additivity.org.hibernate.loader.plan=false
|
||||||
|
log4j.logger.org.hibernate.persister.walking=trace, stdout-mdc
|
||||||
|
log4j.additivity.org.hibernate.persister.walking=false
|
||||||
|
|
||||||
log4j.logger.org.hibernate.tool.hbm2ddl=trace
|
log4j.logger.org.hibernate.tool.hbm2ddl=trace
|
||||||
log4j.logger.org.hibernate.testing.cache=debug
|
log4j.logger.org.hibernate.testing.cache=debug
|
||||||
|
|
||||||
log4j.logger.org.hibernate.loader.plan=trace
|
|
||||||
|
|
||||||
# SQL Logging - HHH-6833
|
# SQL Logging - HHH-6833
|
||||||
log4j.logger.org.hibernate.SQL=debug
|
log4j.logger.org.hibernate.SQL=debug
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,8 @@ import org.hibernate.persister.collection.CollectionPersister;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.internal.PersisterClassResolverInitiator;
|
import org.hibernate.persister.internal.PersisterClassResolverInitiator;
|
||||||
import org.hibernate.persister.spi.PersisterClassResolver;
|
import org.hibernate.persister.spi.PersisterClassResolver;
|
||||||
|
import org.hibernate.persister.walking.spi.AttributeDefinition;
|
||||||
|
import org.hibernate.persister.walking.spi.EntityIdentifierDefinition;
|
||||||
import org.hibernate.tuple.entity.EntityMetamodel;
|
import org.hibernate.tuple.entity.EntityMetamodel;
|
||||||
import org.hibernate.tuple.entity.EntityTuplizer;
|
import org.hibernate.tuple.entity.EntityTuplizer;
|
||||||
import org.hibernate.tuple.entity.NonPojoInstrumentationMetadata;
|
import org.hibernate.tuple.entity.NonPojoInstrumentationMetadata;
|
||||||
|
@ -609,6 +611,21 @@ public class PersisterClassProviderTest {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityPersister getEntityPersister() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityIdentifierDefinition getEntityKeyDefinition() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<AttributeDefinition> getAttributes() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class GoofyException extends RuntimeException {
|
public static class GoofyException extends RuntimeException {
|
||||||
|
|
Loading…
Reference in New Issue