Skip to content

Commit

Permalink
HHH-7094 Call autoFlushIfRequired before naturalId query execution
Browse files Browse the repository at this point in the history
  • Loading branch information
edalquist committed Feb 21, 2012
1 parent 13f4c83 commit ec86bf9
Showing 1 changed file with 53 additions and 48 deletions.
101 changes: 53 additions & 48 deletions hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java
Expand Up @@ -41,6 +41,7 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -80,7 +81,6 @@
import org.hibernate.UnresolvableObjectException;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.criterion.NaturalIdentifier;
import org.hibernate.criterion.Restrictions;
import org.hibernate.engine.internal.StatefulPersistenceContext;
import org.hibernate.engine.jdbc.LobCreator;
import org.hibernate.engine.query.spi.FilterQueryPlan;
Expand Down Expand Up @@ -2351,12 +2351,11 @@ private EntityPersister locateEntityPersister(String entityName) {
return entityPersister;
}

private class NaturalIdLoadAccessImpl implements NaturalIdLoadAccess {
private abstract class BaseNaturalIdLoadAccessImpl {
private final EntityPersister entityPersister;
private final Map<String, Object> naturalIdParameters = new LinkedHashMap<String, Object>();
private LockOptions lockOptions;

private NaturalIdLoadAccessImpl(EntityPersister entityPersister) {
private BaseNaturalIdLoadAccessImpl(EntityPersister entityPersister) {
this.entityPersister = entityPersister;

if ( ! entityPersister.hasNaturalIdentifier() ) {
Expand All @@ -2366,44 +2365,71 @@ private NaturalIdLoadAccessImpl(EntityPersister entityPersister) {
}
}

private NaturalIdLoadAccessImpl(String entityName) {
private BaseNaturalIdLoadAccessImpl(String entityName) {
this( locateEntityPersister( entityName ) );
}

private NaturalIdLoadAccessImpl(Class entityClass) {
private BaseNaturalIdLoadAccessImpl(Class entityClass) {
this( entityClass.getName() );
}

@Override
public final NaturalIdLoadAccess with(LockOptions lockOptions) {
public BaseNaturalIdLoadAccessImpl with(LockOptions lockOptions) {
this.lockOptions = lockOptions;
return this;
}

@Override
public NaturalIdLoadAccess using(String attributeName, Object value) {
naturalIdParameters.put( attributeName, value );
return this;
}

protected Serializable resolveNaturalId() {
protected final Serializable resolveNaturalId(Map<String, Object> naturalIdParameters) {
final Set<Serializable> querySpaces = new LinkedHashSet<Serializable>();
for ( final Serializable querySpace : entityPersister.getQuerySpaces() ) {
querySpaces.add( querySpace );
}

autoFlushIfRequired( querySpaces );

final ResolveNaturalIdEvent event =
new ResolveNaturalIdEvent( naturalIdParameters, entityPersister, SessionImpl.this );
fireResolveNaturalId( event );
return event.getEntityId();
}

protected IdentifierLoadAccess getIdentifierLoadAccess() {
protected final IdentifierLoadAccess getIdentifierLoadAccess() {
final IdentifierLoadAccessImpl identifierLoadAccess = new IdentifierLoadAccessImpl( entityPersister );
if ( this.lockOptions != null ) {
identifierLoadAccess.with( lockOptions );
}
return identifierLoadAccess;
}
}

private class NaturalIdLoadAccessImpl extends BaseNaturalIdLoadAccessImpl implements NaturalIdLoadAccess {
private final Map<String, Object> naturalIdParameters = new LinkedHashMap<String, Object>();

private NaturalIdLoadAccessImpl(EntityPersister entityPersister) {
super(entityPersister);
}

private NaturalIdLoadAccessImpl(String entityName) {
this( locateEntityPersister( entityName ) );
}

private NaturalIdLoadAccessImpl(Class entityClass) {
this( entityClass.getName() );
}

@Override
public NaturalIdLoadAccessImpl with(LockOptions lockOptions) {
return (NaturalIdLoadAccessImpl) super.with( lockOptions );
}

@Override
public NaturalIdLoadAccess using(String attributeName, Object value) {
naturalIdParameters.put( attributeName, value );
return this;
}

@Override
public final Object getReference() {
final Serializable entityId = resolveNaturalId();
final Serializable entityId = resolveNaturalId( this.naturalIdParameters );
if ( entityId == null ) {
return null;
}
Expand All @@ -2412,27 +2438,19 @@ public final Object getReference() {

@Override
public final Object load() {
final Serializable entityId = resolveNaturalId();
final Serializable entityId = resolveNaturalId( this.naturalIdParameters );
if ( entityId == null ) {
return null;
}
return this.getIdentifierLoadAccess().load( entityId );
}
}

private class SimpleNaturalIdLoadAccessImpl implements SimpleNaturalIdLoadAccess {
private final EntityPersister entityPersister;
private class SimpleNaturalIdLoadAccessImpl extends BaseNaturalIdLoadAccessImpl implements SimpleNaturalIdLoadAccess {
private final String naturalIdAttributeName;
private LockOptions lockOptions;

private SimpleNaturalIdLoadAccessImpl(EntityPersister entityPersister) {
this.entityPersister = entityPersister;

if ( ! entityPersister.hasNaturalIdentifier() ) {
throw new HibernateException(
String.format( "Entity [%s] did not define a natural id", entityPersister.getEntityName() )
);
}
super(entityPersister);

if ( entityPersister.getNaturalIdentifierProperties().length != 1 ) {
throw new HibernateException(
Expand All @@ -2454,13 +2472,16 @@ private SimpleNaturalIdLoadAccessImpl(Class entityClass) {

@Override
public final SimpleNaturalIdLoadAccessImpl with(LockOptions lockOptions) {
this.lockOptions = lockOptions;
return this;
return (SimpleNaturalIdLoadAccessImpl) super.with( lockOptions );
}

private Map<String, Object> getNaturalIdParameters(Object naturalIdValue) {
return Collections.singletonMap( naturalIdAttributeName, naturalIdValue );
}

@Override
public Object getReference(Object naturalIdValue) {
final Serializable entityId = resolveNaturalId( naturalIdValue );
final Serializable entityId = resolveNaturalId( getNaturalIdParameters( naturalIdValue ) );
if ( entityId == null ) {
return null;
}
Expand All @@ -2469,27 +2490,11 @@ public Object getReference(Object naturalIdValue) {

@Override
public Object load(Object naturalIdValue) {
final Serializable entityId = resolveNaturalId( naturalIdValue );
final Serializable entityId = resolveNaturalId( getNaturalIdParameters( naturalIdValue ) );
if ( entityId == null ) {
return null;
}
return this.getIdentifierLoadAccess().load( entityId );
}

private Serializable resolveNaturalId(Object naturalIdValue) {
final Map<String,Object> naturalIdValueMap = Collections.singletonMap( naturalIdAttributeName, naturalIdValue );
final ResolveNaturalIdEvent event =
new ResolveNaturalIdEvent( naturalIdValueMap, entityPersister, SessionImpl.this );
fireResolveNaturalId( event );
return event.getEntityId();
}

private IdentifierLoadAccess getIdentifierLoadAccess() {
final IdentifierLoadAccessImpl identifierLoadAccess = new IdentifierLoadAccessImpl( entityPersister );
if ( this.lockOptions != null ) {
identifierLoadAccess.with( lockOptions );
}
return identifierLoadAccess;
}
}
}

0 comments on commit ec86bf9

Please sign in to comment.