/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* 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.ogm.datastore.neo4j.dialect.impl;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
/**
* An {@link EntityKeyMetadata} that keeps track of the discriminator value.
* <p>
* Entities in a hierarchy using single table inheritance strategy have the same {@link EntityKeyMetadata}, to make sure
* that the metadata key is unique for each entity type we also keep track of the discriminator value.
*
* @author Davide D'Alto
*/
public class DiscriminatorAwareKeyMetadata implements EntityKeyMetadata {
private final EntityKeyMetadata delegate;
private final Object discriminatorValue;
public DiscriminatorAwareKeyMetadata(EntityKeyMetadata delegate, Object discriminatorValue) {
this.delegate = delegate;
this.discriminatorValue = discriminatorValue;
}
public String getTable() {
return delegate.getTable();
}
public String[] getColumnNames() {
return delegate.getColumnNames();
}
public boolean isKeyColumn(String columnName) {
return delegate.isKeyColumn( columnName );
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ( ( delegate == null ) ? 0 : delegate.hashCode() );
result = prime * result + ( ( discriminatorValue == null ) ? 0 : discriminatorValue.hashCode() );
return result;
}
@Override
public boolean equals(Object obj) {
if ( this == obj ) {
return true;
}
if ( obj == null ) {
return false;
}
if ( getClass() != obj.getClass() ) {
return false;
}
DiscriminatorAwareKeyMetadata other = (DiscriminatorAwareKeyMetadata) obj;
if ( delegate == null ) {
if ( other.delegate != null ) {
return false;
}
}
else if ( !delegate.equals( other.delegate ) ) {
return false;
}
if ( discriminatorValue == null ) {
if ( other.discriminatorValue != null ) {
return false;
}
}
else if ( !discriminatorValue.equals( other.discriminatorValue ) ) {
return false;
}
return true;
}
}