HHH-6168 : Misc fixes to many-to-one AttributeBinding

This commit is contained in:
Gail Badner 2011-05-01 19:42:18 -07:00
parent b667767f85
commit 99cec1404f
8 changed files with 91 additions and 87 deletions

View File

@ -31,13 +31,11 @@ import java.util.Map;
import java.util.Set;
import org.hibernate.MappingException;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.metamodel.domain.Attribute;
import org.hibernate.metamodel.domain.MetaAttribute;
import org.hibernate.metamodel.relational.Column;
import org.hibernate.metamodel.relational.DerivedValue;
import org.hibernate.metamodel.relational.SimpleValue;
import org.hibernate.metamodel.relational.Size;
import org.hibernate.metamodel.relational.TableSpecification;
import org.hibernate.metamodel.relational.Tuple;
import org.hibernate.metamodel.relational.Value;
@ -83,7 +81,7 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
this.entityBinding = entityBinding;
}
public void initialize(DomainState state) {
protected void initialize(DomainState state) {
hibernateTypeDescriptor.initialize( state.getHibernateTypeDescriptor() );
attribute = state.getAttribute();
isLazy = state.isLazy();
@ -118,8 +116,7 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
}
protected void initializeColumnValue(ColumnRelationalState state) {
Column columnValue = createColumn( state );
setValue( columnValue );
value = createColumn( state );
}
private Column createColumn(ColumnRelationalState state) {
@ -151,17 +148,20 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
return columnValue;
}
public final void initialize(RelationalState state) {
// TODO: move this logic out...
protected void initialize(RelationalState state) {
if ( SingleValueRelationalState.class.isInstance( state ) ) {
initializeSingleValue( SingleValueRelationalState.class.cast( state ) );
}
else if ( SimpleTupleRelationalState.class.isInstance( state ) ) {
initializeTupleValue( SimpleTupleRelationalState.class.cast( state ).getRelationalStates() );
initializeSimpleTupleValue( SimpleTupleRelationalState.class.cast( state ) );
}
else {
throw new MappingException( "Unexpected type of RelationalState" + state.getClass().getName() );
}
}
public final <T extends DerivedRelationalState> void initializeDerivedValue(T state) {
protected <T extends DerivedRelationalState> void initializeDerivedValue(T state) {
value = createDerivedValue( state );
}
@ -169,11 +169,11 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
return getEntityBinding().getBaseTable().createDerivedValue( state.getFormula() );
}
public final void initializeSingleValue(SingleValueRelationalState state) {
private void initializeSingleValue(SingleValueRelationalState state) {
value = createSingleValue( state );
}
protected SimpleValue createSingleValue(SingleValueRelationalState state) {
private SimpleValue createSingleValue(SingleValueRelationalState state) {
if ( state instanceof ColumnRelationalState ) {
return createColumn( ColumnRelationalState.class.cast( state ) );
}
@ -185,31 +185,31 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
}
}
protected final void initializeTupleValue(Set<SingleValueRelationalState> singleValueStates) {
if ( singleValueStates.size() == 0 ) {
protected void initializeSimpleTupleValue(SimpleTupleRelationalState state) {
if ( state.getRelationalStates().size() == 0 ) {
throw new MappingException( "Tuple state does not contain any values." );
}
if ( singleValueStates.size() == 1 ) {
initializeSingleValue( singleValueStates.iterator().next() );
if ( state.getRelationalStates().size() == 1 ) {
initializeSingleValue( state.getRelationalStates().iterator().next() );
}
else {
Tuple tuple = getEntityBinding().getBaseTable().createTuple( "[" + getAttribute().getName() + "]" );
for ( SingleValueRelationalState singleValueState : singleValueStates ) {
tuple.addValue( createSingleValue( singleValueState ) );
}
value = tuple;
value = createSimpleTupleValue( state );
}
}
private Tuple createSimpleTupleValue(SimpleTupleRelationalState state) {
Tuple tuple = getEntityBinding().getBaseTable().createTuple( "[" + getAttribute().getName() + "]" );
for ( SingleValueRelationalState singleValueState : state.getRelationalStates() ) {
tuple.addValue( createSingleValue( singleValueState ) );
}
return tuple;
}
@Override
public Value getValue() {
return value;
}
protected void setValue(Value value) {
this.value = value;
}
@Override
public HibernateTypeDescriptor getHibernateTypeDescriptor() {
return hibernateTypeDescriptor;
@ -328,34 +328,4 @@ public abstract class AbstractAttributeBinding implements AttributeBinding {
}
}
public static interface RelationalState {}
public static interface SingleValueRelationalState extends RelationalState {}
public static interface ColumnRelationalState extends SingleValueRelationalState {
NamingStrategy getNamingStrategy();
String getExplicitColumnName();
boolean isUnique();
Size getSize();
boolean isNullable();
String getCheckCondition();
String getDefault();
String getSqlType();
String getCustomWriteFragment();
String getCustomReadFragment();
String getComment();
Set<String> getUniqueKeys();
Set<String> getIndexes();
}
public static interface DerivedRelationalState extends SingleValueRelationalState {
String getFormula();
}
public static interface SimpleTupleRelationalState extends TupleRelationalState<SingleValueRelationalState> {
}
public static interface TupleRelationalState<T extends RelationalState> extends RelationalState{
Set<T> getRelationalStates();
}
}

View File

@ -23,12 +23,15 @@
*/
package org.hibernate.metamodel.binding;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.metamodel.domain.Attribute;
import org.hibernate.metamodel.domain.MetaAttribute;
import org.hibernate.metamodel.relational.SimpleValue;
import org.hibernate.metamodel.relational.Size;
import org.hibernate.metamodel.relational.TableSpecification;
import org.hibernate.metamodel.relational.Value;
@ -108,4 +111,37 @@ public interface AttributeBinding {
public Set<EntityReferencingAttributeBinding> getEntityReferencingAttributeBindings();
public void validate();
// TODO: where should this RelationalState stuff go???
interface RelationalState {}
interface SingleValueRelationalState extends RelationalState {}
interface ColumnRelationalState extends SingleValueRelationalState {
NamingStrategy getNamingStrategy();
String getExplicitColumnName();
boolean isUnique();
Size getSize();
boolean isNullable();
String getCheckCondition();
String getDefault();
String getSqlType();
String getCustomWriteFragment();
String getCustomReadFragment();
String getComment();
Set<String> getUniqueKeys();
Set<String> getIndexes();
}
interface DerivedRelationalState extends SingleValueRelationalState {
String getFormula();
}
interface SimpleTupleRelationalState extends AbstractAttributeBinding.TupleRelationalState<SingleValueRelationalState> {
}
interface TupleRelationalState<T extends RelationalState> extends RelationalState{
List<T> getRelationalStates();
}
}

View File

@ -52,7 +52,7 @@ public class ManyToOneAttributeBinding extends SingularAttributeBinding implemen
boolean ignoreNotFound();
}
public static interface ManyToOneRelationalState extends RelationalState {
public static interface RelationalState extends AttributeBinding.RelationalState {
boolean isLogicalOneToOne();
String getForeignKeyName();
}
@ -75,7 +75,7 @@ public class ManyToOneAttributeBinding extends SingularAttributeBinding implemen
}
}
public final void initialize(ManyToOneRelationalState state) {
public final void initialize(RelationalState state) {
super.initialize( state );
isLogicalOneToOne = state.isLogicalOneToOne();
foreignKeyName = state.getForeignKeyName();

View File

@ -23,7 +23,6 @@
*/
package org.hibernate.metamodel.binding;
import org.hibernate.MappingException;
import org.hibernate.mapping.PropertyGeneration;
/**
@ -47,16 +46,16 @@ public class SimpleAttributeBinding extends SingularAttributeBinding {
generation = state.getPropertyGeneration();
}
public final void initializeTupleValue(SimpleTupleRelationalState state) {
if ( state.getRelationalStates().size() == 0 ) {
throw new MappingException( "Tuple state does not contain any values." );
}
if ( state.getRelationalStates().size() == 1 ) {
initializeSingleValue( state.getRelationalStates().iterator().next() );
}
else {
initializeTupleValue( state.getRelationalStates() );
}
public void initializeColumnValue(ColumnRelationalState state) {
super.initializeColumnValue( state );
}
public void initializeDerivedValue(DerivedRelationalState state) {
super.initializeDerivedValue( state );
}
public void initializeSimpleTupleValue(SimpleTupleRelationalState state) {
super.initializeSimpleTupleValue( state );
}
private boolean isUnique(ColumnRelationalState state) {

View File

@ -23,7 +23,7 @@
*/
package org.hibernate.metamodel.source.annotations;
import java.util.LinkedHashSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -35,6 +35,8 @@ import org.hibernate.MappingException;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.mapping.PropertyGeneration;
import org.hibernate.metamodel.binding.AbstractAttributeBinding;
import org.hibernate.metamodel.binding.AttributeBinding;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.binding.HibernateTypeDescriptor;
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
@ -144,7 +146,7 @@ public class EntityBinder {
AnnotationSimpleAttributeRelationalState relationalState = new AnnotationSimpleAttributeRelationalState();
relationalState.valueStates.add( columnRelationsState );
idBinding.initializeTupleValue( relationalState );
idBinding.initializeSimpleTupleValue( relationalState );
}
private void bindHibernateEntityAnnotation(EntityBinding entityBinding) {
@ -316,10 +318,10 @@ public class EntityBinder {
public static class AnnotationSimpleAttributeRelationalState
implements SimpleAttributeBinding.SimpleTupleRelationalState {
LinkedHashSet<SimpleAttributeBinding.SingleValueRelationalState> valueStates = new LinkedHashSet<SimpleAttributeBinding.SingleValueRelationalState>();
List<AttributeBinding.SingleValueRelationalState> valueStates = new ArrayList<AttributeBinding.SingleValueRelationalState>();
@Override
public LinkedHashSet<SimpleAttributeBinding.SingleValueRelationalState> getRelationalStates() {
public List<AttributeBinding.SingleValueRelationalState> getRelationalStates() {
return valueStates;
}
}

View File

@ -23,16 +23,12 @@
*/
package org.hibernate.metamodel.source.hbm;
import java.sql.ResultSet;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.hibernate.EntityMode;
import org.hibernate.MappingException;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.engine.Versioning;
import org.hibernate.engine.jdbc.batch.spi.Batch;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.metamodel.binding.AttributeBinding;
import org.hibernate.metamodel.binding.BagBinding;
@ -42,7 +38,6 @@ import org.hibernate.metamodel.binding.PluralAttributeBinding;
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
import org.hibernate.metamodel.domain.Entity;
import org.hibernate.metamodel.domain.Hierarchical;
import org.hibernate.metamodel.domain.PluralAttribute;
import org.hibernate.metamodel.domain.PluralAttributeNature;
import org.hibernate.metamodel.relational.Schema;
import org.hibernate.metamodel.relational.Table;
@ -440,7 +435,7 @@ PrimitiveArray
if ( attributeBinding.getValue() == null ) {
// relational model has not been bound yet
// boolean (true here) indicates that by default column names should be guessed
attributeBinding.initializeTupleValue(
attributeBinding.initializeSimpleTupleValue(
new HbmSimpleValueRelationalStateContainer(
getHibernateMappingBinder(),
true,
@ -468,7 +463,7 @@ PrimitiveArray
if ( attributeBinding.getValue() == null ) {
// relational model has not been bound yet
// boolean (true here) indicates that by default column names should be guessed
attributeBinding.initializeTupleValue(
attributeBinding.initializeSimpleTupleValue(
new HbmSimpleValueRelationalStateContainer(
getHibernateMappingBinder(),
true,
@ -496,7 +491,7 @@ PrimitiveArray
if ( attributeBinding.getValue() == null ) {
// relational model has not been bound yet
// boolean (true here) indicates that by default column names should be guessed
attributeBinding.initializeTupleValue(
attributeBinding.initializeSimpleTupleValue(
new HbmSimpleValueRelationalStateContainer(
getHibernateMappingBinder(),
true,
@ -524,7 +519,7 @@ PrimitiveArray
if ( attributeBinding.getValue() == null ) {
// relational model has not been bound yet
// boolean (true here) indicates that by default column names should be guessed
attributeBinding.initializeTupleValue(
attributeBinding.initializeSimpleTupleValue(
new HbmSimpleValueRelationalStateContainer(
getHibernateMappingBinder(),
true,
@ -551,7 +546,7 @@ PrimitiveArray
if ( attributeBinding.getValue() == null ) {
// relational model has not been bound yet
// boolean (true here) indicates that by default column names should be guessed
attributeBinding.initializeTupleValue(
attributeBinding.initializeSimpleTupleValue(
new HbmSimpleValueRelationalStateContainer(
getHibernateMappingBinder(),
true,

View File

@ -23,6 +23,7 @@
*/
package org.hibernate.metamodel.source.hbm.state.relational;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
@ -31,6 +32,7 @@ import java.util.Set;
import org.hibernate.MappingException;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.metamodel.binding.AbstractAttributeBinding;
import org.hibernate.metamodel.binding.AttributeBinding;
import org.hibernate.metamodel.binding.HibernateTypeDescriptor;
import org.hibernate.metamodel.binding.MappingDefaults;
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
@ -49,7 +51,7 @@ public class HbmSimpleValueRelationalStateContainer implements AbstractAttribute
private final MappingDefaults defaults;
private final Set<String> propertyUniqueKeys;
private final Set<String> propertyIndexes;
private final Set<SimpleAttributeBinding.SingleValueRelationalState> singleValueStates;
private final List<AttributeBinding.SingleValueRelationalState> singleValueStates;
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
public NamingStrategy getNamingStrategy() {
@ -169,7 +171,7 @@ public class HbmSimpleValueRelationalStateContainer implements AbstractAttribute
this.defaults = defaults;
this.propertyUniqueKeys = Collections.emptySet();
this.propertyIndexes = Collections.emptySet();
singleValueStates = new LinkedHashSet<SimpleAttributeBinding.SingleValueRelationalState>(
singleValueStates = new ArrayList<AttributeBinding.SingleValueRelationalState>(
mappedColumnsOrFormulas == null || mappedColumnsOrFormulas.isEmpty() ?
1 :
mappedColumnsOrFormulas.size()
@ -181,7 +183,7 @@ public class HbmSimpleValueRelationalStateContainer implements AbstractAttribute
}
}
private static SimpleAttributeBinding.SingleValueRelationalState createColumnOrFormulaRelationalState(
private static AttributeBinding.SingleValueRelationalState createColumnOrFormulaRelationalState(
HbmSimpleValueRelationalStateContainer container,
Object columnOrFormula) {
if ( XMLColumnElement.class.isInstance( columnOrFormula ) ) {
@ -196,7 +198,7 @@ public class HbmSimpleValueRelationalStateContainer implements AbstractAttribute
throw new MappingException( "unknown type of column or formula: " + columnOrFormula.getClass().getName() );
}
public Set<SimpleAttributeBinding.SingleValueRelationalState> getRelationalStates() {
public List<AttributeBinding.SingleValueRelationalState> getRelationalStates() {
return singleValueStates;
}

View File

@ -68,6 +68,6 @@ public class SimpleValueBindingTests extends BaseUnitTestCase {
idColumn.setSize( Size.precision( 18, 0 ) );
table.getPrimaryKey().addColumn( idColumn );
table.getPrimaryKey().setName( "my_table_pk" );
attributeBinding.setValue( idColumn );
//attributeBinding.setValue( idColumn );
}
}