HHH-7571 Minimal implementation of @ElementCollection details to pass AnnotationBasicCollectionBindingTests
This commit is contained in:
parent
fd6cacd6f4
commit
d14d18e40b
|
@ -28,8 +28,12 @@ package org.hibernate.jaxb.spi.hbm;
|
||||||
*/
|
*/
|
||||||
public interface TableInformationSource {
|
public interface TableInformationSource {
|
||||||
public String getSchema();
|
public String getSchema();
|
||||||
|
|
||||||
public String getCatalog();
|
public String getCatalog();
|
||||||
|
|
||||||
public String getTable();
|
public String getTable();
|
||||||
|
|
||||||
public String getSubselect();
|
public String getSubselect();
|
||||||
|
|
||||||
public String getSubselectAttribute();
|
public String getSubselectAttribute();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2173,8 +2173,7 @@ public class Binder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private PluralAttributeElementBinding.Nature pluralAttributeElementNature(PluralAttributeSource attributeSource) {
|
private PluralAttributeElementBinding.Nature pluralAttributeElementNature(PluralAttributeSource attributeSource) {
|
||||||
return PluralAttributeElementBinding.Nature
|
return PluralAttributeElementBinding.Nature.valueOf( attributeSource.getElementSource().getNature().name() );
|
||||||
.valueOf( attributeSource.getElementSource().getNature().name() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private PluralAttributeIndexBinding.Nature pluralAttributeIndexNature(PluralAttributeSource attributeSource) {
|
private PluralAttributeIndexBinding.Nature pluralAttributeIndexNature(PluralAttributeSource attributeSource) {
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package org.hibernate.metamodel.internal.source.annotations;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.AssociationAttribute;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.Column;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.MappedAttribute;
|
||||||
|
import org.hibernate.metamodel.spi.source.BasicPluralAttributeElementSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource;
|
||||||
|
import org.hibernate.metamodel.spi.source.RelationalValueSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Hardy Ferentschik
|
||||||
|
*/
|
||||||
|
public class BasicPluralAttributeElementSourceImpl implements BasicPluralAttributeElementSource {
|
||||||
|
private final AssociationAttribute associationAttribute;
|
||||||
|
|
||||||
|
public BasicPluralAttributeElementSourceImpl(AssociationAttribute associationAttribute) {
|
||||||
|
this.associationAttribute = associationAttribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExplicitHibernateTypeSource getExplicitHibernateTypeSource() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Nature getNature() {
|
||||||
|
if ( MappedAttribute.Nature.ELEMENT_COLLECTION_BASIC.equals( associationAttribute.getNature() ) ) {
|
||||||
|
return Nature.BASIC;
|
||||||
|
}
|
||||||
|
else if ( MappedAttribute.Nature.ELEMENT_COLLECTION_EMBEDDABLE.equals( associationAttribute.getNature() ) ) {
|
||||||
|
return Nature.COMPONENT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new AssertionError(
|
||||||
|
"Wrong attribute nature for a element collection attribute: " + associationAttribute.getNature()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<RelationalValueSource> relationalValueSources() {
|
||||||
|
List<RelationalValueSource> valueSources = new ArrayList<RelationalValueSource>( );
|
||||||
|
if ( !associationAttribute.getColumnValues().isEmpty() ) {
|
||||||
|
for ( Column columnValues : associationAttribute.getColumnValues() ) {
|
||||||
|
valueSources.add( new ColumnSourceImpl( associationAttribute, null, columnValues ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return valueSources;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean areValuesIncludedInInsertByDefault() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean areValuesIncludedInUpdateByDefault() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean areValuesNullableByDefault() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,12 @@ public class EntitySourceImpl implements EntitySource {
|
||||||
:new PluralAttributeSourceImpl( ( PluralAssociationAttribute ) associationAttribute );
|
:new PluralAttributeSourceImpl( ( PluralAssociationAttribute ) associationAttribute );
|
||||||
attributeList.add( source );
|
attributeList.add( source );
|
||||||
break;
|
break;
|
||||||
|
case ELEMENT_COLLECTION_BASIC:
|
||||||
|
case ELEMENT_COLLECTION_EMBEDDABLE: {
|
||||||
|
source = new PluralAttributeSourceImpl( ( PluralAssociationAttribute ) associationAttribute );
|
||||||
|
attributeList.add( source );
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
throw new NotYetImplementedException();
|
throw new NotYetImplementedException();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.hibernate.metamodel.internal.source.annotations;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.CascadeStyle;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.util.EnumConversionHelper;
|
||||||
|
import org.hibernate.metamodel.spi.source.ManyToAnyPluralAttributeElementSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Hardy Ferentschik
|
||||||
|
*/
|
||||||
|
public class ManyToAnyPluralAttributeElementSourceImpl implements ManyToAnyPluralAttributeElementSource {
|
||||||
|
private final PluralAssociationAttribute attribute;
|
||||||
|
|
||||||
|
public ManyToAnyPluralAttributeElementSourceImpl(PluralAssociationAttribute attribute) {
|
||||||
|
this.attribute = attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<CascadeStyle> getCascadeStyles() {
|
||||||
|
return EnumConversionHelper.cascadeTypeToCascadeStyleSet( attribute.getCascadeTypes(), attribute.getContext() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Nature getNature() {
|
||||||
|
return Nature.MANY_TO_ANY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, 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
|
||||||
|
*/
|
||||||
|
package org.hibernate.metamodel.internal.source.annotations;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.CascadeStyle;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
|
||||||
|
import org.hibernate.metamodel.internal.source.annotations.util.EnumConversionHelper;
|
||||||
|
import org.hibernate.metamodel.spi.source.OneToManyPluralAttributeElementSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Hardy Ferentschik
|
||||||
|
*/
|
||||||
|
public class OneToManyAttributeElementSourceImpl implements OneToManyPluralAttributeElementSource {
|
||||||
|
private final PluralAssociationAttribute attribute;
|
||||||
|
|
||||||
|
public OneToManyAttributeElementSourceImpl(PluralAssociationAttribute attribute) {
|
||||||
|
this.attribute = attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getReferencedEntityName() {
|
||||||
|
return attribute.getReferencedEntityType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNotFoundAnException() {
|
||||||
|
return !attribute.isIgnoreNotFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<CascadeStyle> getCascadeStyles() {
|
||||||
|
return EnumConversionHelper.cascadeTypeToCascadeStyleSet( attribute.getCascadeTypes(), attribute.getContext() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Nature getNature() {
|
||||||
|
return Nature.ONE_TO_MANY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,16 +115,15 @@ public class PluralAttributeKeySourceImpl implements PluralAttributeKeySource {
|
||||||
|
|
||||||
public JoinColumnResolutionDelegateImpl(PluralAssociationAttribute attribute) {
|
public JoinColumnResolutionDelegateImpl(PluralAssociationAttribute attribute) {
|
||||||
this.attribute = attribute;
|
this.attribute = attribute;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Value> getJoinColumns(JoinColumnResolutionContext context) {
|
public List<Value> getJoinColumns(JoinColumnResolutionContext context) {
|
||||||
List<Column> joinClumnValues = attribute.getJoinColumnValues();
|
List<Column> joinColumnValues = attribute.getJoinColumnValues();
|
||||||
if ( joinClumnValues.isEmpty() ) {
|
if ( joinColumnValues.isEmpty() ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
List<Value> result = new ArrayList<Value>( joinClumnValues.size() );
|
List<Value> result = new ArrayList<Value>( joinColumnValues.size() );
|
||||||
for ( Column column : attribute.getJoinColumnValues() ) {
|
for ( Column column : attribute.getJoinColumnValues() ) {
|
||||||
result.add( context.resolveColumn( column.getReferencedColumnName(), null, null, null ) );
|
result.add( context.resolveColumn( column.getReferencedColumnName(), null, null, null ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,26 +27,22 @@ import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.CascadeType;
|
|
||||||
|
|
||||||
import org.hibernate.FetchMode;
|
import org.hibernate.FetchMode;
|
||||||
import org.hibernate.engine.FetchStyle;
|
import org.hibernate.engine.FetchStyle;
|
||||||
import org.hibernate.engine.FetchTiming;
|
import org.hibernate.engine.FetchTiming;
|
||||||
import org.hibernate.engine.spi.CascadeStyle;
|
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.util.EnumConversionHelper;
|
|
||||||
import org.hibernate.metamodel.spi.binding.Caching;
|
import org.hibernate.metamodel.spi.binding.Caching;
|
||||||
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
import org.hibernate.metamodel.spi.binding.CustomSQL;
|
||||||
import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource;
|
import org.hibernate.metamodel.spi.source.ExplicitHibernateTypeSource;
|
||||||
import org.hibernate.metamodel.spi.source.ManyToAnyPluralAttributeElementSource;
|
|
||||||
import org.hibernate.metamodel.spi.source.MetaAttributeSource;
|
import org.hibernate.metamodel.spi.source.MetaAttributeSource;
|
||||||
import org.hibernate.metamodel.spi.source.OneToManyPluralAttributeElementSource;
|
|
||||||
import org.hibernate.metamodel.spi.source.Orderable;
|
import org.hibernate.metamodel.spi.source.Orderable;
|
||||||
import org.hibernate.metamodel.spi.source.PluralAttributeElementSource;
|
import org.hibernate.metamodel.spi.source.PluralAttributeElementSource;
|
||||||
import org.hibernate.metamodel.spi.source.PluralAttributeKeySource;
|
import org.hibernate.metamodel.spi.source.PluralAttributeKeySource;
|
||||||
import org.hibernate.metamodel.spi.source.PluralAttributeSource;
|
import org.hibernate.metamodel.spi.source.PluralAttributeSource;
|
||||||
import org.hibernate.metamodel.spi.source.Sortable;
|
import org.hibernate.metamodel.spi.source.Sortable;
|
||||||
|
import org.hibernate.metamodel.spi.source.TableSource;
|
||||||
import org.hibernate.metamodel.spi.source.TableSpecificationSource;
|
import org.hibernate.metamodel.spi.source.TableSpecificationSource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,21 +74,6 @@ public class PluralAttributeSourceImpl implements PluralAttributeSource, Orderab
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private Nature resolveAttributeNature() {
|
|
||||||
if ( Map.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
|
||||||
return PluralAttributeSource.Nature.MAP;
|
|
||||||
}
|
|
||||||
else if ( List.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
|
||||||
return PluralAttributeSource.Nature.LIST;
|
|
||||||
}
|
|
||||||
else if ( Set.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
|
||||||
return PluralAttributeSource.Nature.SET;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return PluralAttributeSource.Nature.BAG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Nature getNature() {
|
public Nature getNature() {
|
||||||
return nature;
|
return nature;
|
||||||
|
@ -103,7 +84,7 @@ public class PluralAttributeSourceImpl implements PluralAttributeSource, Orderab
|
||||||
return elementSource;
|
return elementSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
private PluralAttributeElementSource determineElementSource (){
|
private PluralAttributeElementSource determineElementSource() {
|
||||||
switch ( attribute.getNature() ) {
|
switch ( attribute.getNature() ) {
|
||||||
case MANY_TO_MANY:
|
case MANY_TO_MANY:
|
||||||
return new ManyToManyPluralAttributeElementSourceImpl( attribute );
|
return new ManyToManyPluralAttributeElementSourceImpl( attribute );
|
||||||
|
@ -111,6 +92,10 @@ public class PluralAttributeSourceImpl implements PluralAttributeSource, Orderab
|
||||||
return new ManyToAnyPluralAttributeElementSourceImpl( attribute );
|
return new ManyToAnyPluralAttributeElementSourceImpl( attribute );
|
||||||
case ONE_TO_MANY:
|
case ONE_TO_MANY:
|
||||||
return new OneToManyPluralAttributeElementSourceImpl( attribute );
|
return new OneToManyPluralAttributeElementSourceImpl( attribute );
|
||||||
|
case ELEMENT_COLLECTION_BASIC:
|
||||||
|
case ELEMENT_COLLECTION_EMBEDDABLE: {
|
||||||
|
return new BasicPluralAttributeElementSourceImpl( attribute );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
throw new AssertionError( "unexpected attribute nature" );
|
throw new AssertionError( "unexpected attribute nature" );
|
||||||
}
|
}
|
||||||
|
@ -122,8 +107,24 @@ public class PluralAttributeSourceImpl implements PluralAttributeSource, Orderab
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TableSpecificationSource getCollectionTableSpecificationSource() {
|
public TableSpecificationSource getCollectionTableSpecificationSource() {
|
||||||
// todo see org.hibernate.metamodel.internal.Binder#bindOneToManyCollectionKey
|
// todo - see org.hibernate.metamodel.internal.Binder#bindOneToManyCollectionKey
|
||||||
return null;
|
// todo - needs to cater for @CollectionTable and @JoinTable
|
||||||
|
return new TableSource() {
|
||||||
|
@Override
|
||||||
|
public String getExplicitSchemaName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getExplicitCatalogName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getExplicitTableName() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -252,55 +253,19 @@ public class PluralAttributeSourceImpl implements PluralAttributeSource, Orderab
|
||||||
public FetchStyle getFetchStyle() {
|
public FetchStyle getFetchStyle() {
|
||||||
return attribute.getFetchStyle();
|
return attribute.getFetchStyle();
|
||||||
}
|
}
|
||||||
public Iterable<CascadeStyle> interpretCascadeStyles(Set<CascadeType> cascadeTypes) {
|
|
||||||
return EnumConversionHelper.cascadeTypeToCascadeStyleSet( cascadeTypes, attribute.getContext() );
|
|
||||||
|
|
||||||
|
private Nature resolveAttributeNature() {
|
||||||
}
|
if ( Map.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
||||||
|
return PluralAttributeSource.Nature.MAP;
|
||||||
private class OneToManyPluralAttributeElementSourceImpl implements OneToManyPluralAttributeElementSource {
|
|
||||||
private final PluralAssociationAttribute attribute;
|
|
||||||
|
|
||||||
private OneToManyPluralAttributeElementSourceImpl(PluralAssociationAttribute attribute) {
|
|
||||||
this.attribute = attribute;
|
|
||||||
}
|
}
|
||||||
|
else if ( List.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
||||||
@Override
|
return PluralAttributeSource.Nature.LIST;
|
||||||
public String getReferencedEntityName() {
|
|
||||||
return attribute.getReferencedEntityType();
|
|
||||||
}
|
}
|
||||||
|
else if ( Set.class.isAssignableFrom( attribute.getAttributeType() ) ) {
|
||||||
@Override
|
return PluralAttributeSource.Nature.SET;
|
||||||
public boolean isNotFoundAnException() {
|
|
||||||
return !attribute.isIgnoreNotFound();
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
@Override
|
return PluralAttributeSource.Nature.BAG;
|
||||||
public Iterable<CascadeStyle> getCascadeStyles() {
|
|
||||||
return interpretCascadeStyles( attribute.getCascadeTypes() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Nature getNature() {
|
|
||||||
return Nature.ONE_TO_MANY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ManyToAnyPluralAttributeElementSourceImpl implements ManyToAnyPluralAttributeElementSource {
|
|
||||||
private final PluralAssociationAttribute attribute;
|
|
||||||
|
|
||||||
private ManyToAnyPluralAttributeElementSourceImpl(PluralAssociationAttribute attribute) {
|
|
||||||
this.attribute = attribute;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<CascadeStyle> getCascadeStyles() {
|
|
||||||
return interpretCascadeStyles( attribute.getCascadeTypes() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Nature getNature() {
|
|
||||||
return Nature.MANY_TO_ANY;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,9 +75,9 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
* Defines the column values (relational values) for this property. A mapped property can refer to multiple
|
* Defines the column values (relational values) for this property. A mapped property can refer to multiple
|
||||||
* column values in case of components or join columns etc
|
* column values in case of components or join columns etc
|
||||||
*/
|
*/
|
||||||
private List<Column> columnValues = new ArrayList<Column>( );
|
private List<Column> columnValues = new ArrayList<Column>();
|
||||||
|
|
||||||
private List<Column> joinColumnValues = new ArrayList<Column>( );
|
private List<Column> joinColumnValues = new ArrayList<Column>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is this property an id property (or part thereof).
|
* Is this property an id property (or part thereof).
|
||||||
|
@ -86,7 +86,7 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is this property a natural id property and what's the mutability it is.
|
* Is this property a natural id property and what's the mutability it is.
|
||||||
*/
|
*/
|
||||||
private SingularAttributeBinding.NaturalIdMutability naturalIdMutability;
|
private SingularAttributeBinding.NaturalIdMutability naturalIdMutability;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -154,7 +154,7 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
return columnValues;
|
return columnValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Column> getJoinColumnValues(){
|
public List<Column> getJoinColumnValues() {
|
||||||
return joinColumnValues;
|
return joinColumnValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,7 +229,8 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
if ( naturalIdAnnotation == null ) {
|
if ( naturalIdAnnotation == null ) {
|
||||||
return SingularAttributeBinding.NaturalIdMutability.NOT_NATURAL_ID;
|
return SingularAttributeBinding.NaturalIdMutability.NOT_NATURAL_ID;
|
||||||
}
|
}
|
||||||
final boolean mutable = naturalIdAnnotation.value("mutable") == null ? false : naturalIdAnnotation.value( "mutable" ).asBoolean();
|
final boolean mutable = naturalIdAnnotation.value( "mutable" ) == null ? false :
|
||||||
|
naturalIdAnnotation.value("mutable").asBoolean();
|
||||||
return mutable ? SingularAttributeBinding.NaturalIdMutability.MUTABLE : SingularAttributeBinding.NaturalIdMutability.IMMUTABLE;
|
return mutable ? SingularAttributeBinding.NaturalIdMutability.MUTABLE : SingularAttributeBinding.NaturalIdMutability.IMMUTABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,8 +241,11 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
JPADotNames.COLUMN
|
JPADotNames.COLUMN
|
||||||
);
|
);
|
||||||
if ( columnAnnotation != null ) {
|
if ( columnAnnotation != null ) {
|
||||||
if ( getNature() == Nature.MANY_TO_ONE || getNature() == Nature.ONE_TO_ONE) {
|
if ( getNature() == Nature.MANY_TO_ONE || getNature() == Nature.ONE_TO_ONE ) {
|
||||||
throw getContext().makeMappingException( "@Column(s) not allowed on a "+ getNature() +" property: " +getContext().getOrigin().getName() +"."+ name );
|
throw getContext().makeMappingException(
|
||||||
|
"@Column(s) not allowed on a " + getNature() + " property: " + getContext().getOrigin()
|
||||||
|
.getName() + "." + name
|
||||||
|
);
|
||||||
}
|
}
|
||||||
columnValues.add( new Column( columnAnnotation ) );
|
columnValues.add( new Column( columnAnnotation ) );
|
||||||
}
|
}
|
||||||
|
@ -261,8 +265,11 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
HibernateDotNames.COLUMNS
|
HibernateDotNames.COLUMNS
|
||||||
);
|
);
|
||||||
if ( columnsAnnotation != null ) {
|
if ( columnsAnnotation != null ) {
|
||||||
if ( getNature() == Nature.MANY_TO_ONE || getNature() == Nature.ONE_TO_ONE) {
|
if ( getNature() == Nature.MANY_TO_ONE || getNature() == Nature.ONE_TO_ONE ) {
|
||||||
throw getContext().makeMappingException( "@Column(s) not allowed on a "+ getNature() +" property: " +getContext().getOrigin().getName() +"."+ name );
|
throw getContext().makeMappingException(
|
||||||
|
"@Column(s) not allowed on a " + getNature() + " property: " + getContext().getOrigin()
|
||||||
|
.getName() + "." + name
|
||||||
|
);
|
||||||
}
|
}
|
||||||
List<AnnotationInstance> columnsList = Arrays.asList(
|
List<AnnotationInstance> columnsList = Arrays.asList(
|
||||||
JandexHelper.getValue( columnsAnnotation, "value", AnnotationInstance[].class )
|
JandexHelper.getValue( columnsAnnotation, "value", AnnotationInstance[].class )
|
||||||
|
@ -295,10 +302,9 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
}
|
}
|
||||||
return checkCondition;
|
return checkCondition;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An enum defining the type of a mapped attribute.
|
* An enum defining the type of a mapped attribute.
|
||||||
*
|
|
||||||
* @author Hardy Ferentschik
|
|
||||||
*/
|
*/
|
||||||
public static enum Nature {
|
public static enum Nature {
|
||||||
BASIC( JPADotNames.BASIC ),
|
BASIC( JPADotNames.BASIC ),
|
||||||
|
@ -321,12 +327,6 @@ public abstract class MappedAttribute implements Comparable<MappedAttribute> {
|
||||||
public DotName getAnnotationDotName() {
|
public DotName getAnnotationDotName() {
|
||||||
return annotationDotName;
|
return annotationDotName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Nature{" +annotationDotName.toString()+
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@ import org.hibernate.AnnotationException;
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
import org.hibernate.EntityMode;
|
import org.hibernate.EntityMode;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.cfg.NotYetImplementedException;
|
|
||||||
import org.hibernate.metamodel.internal.source.annotations.AnnotationBindingContext;
|
import org.hibernate.metamodel.internal.source.annotations.AnnotationBindingContext;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.AssociationAttribute;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.AssociationAttribute;
|
||||||
import org.hibernate.metamodel.internal.source.annotations.attribute.AttributeOverride;
|
import org.hibernate.metamodel.internal.source.annotations.attribute.AttributeOverride;
|
||||||
|
@ -461,10 +460,6 @@ public class ConfiguredClass {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ELEMENT_COLLECTION_BASIC:
|
|
||||||
case ELEMENT_COLLECTION_EMBEDDABLE: {
|
|
||||||
throw new NotYetImplementedException( "Element collections must still be implemented." );
|
|
||||||
}
|
|
||||||
case EMBEDDED_ID: {
|
case EMBEDDED_ID: {
|
||||||
final BasicAttribute attribute = BasicAttribute.createSimpleAttribute(
|
final BasicAttribute attribute = BasicAttribute.createSimpleAttribute(
|
||||||
attributeName,
|
attributeName,
|
||||||
|
@ -490,7 +485,6 @@ public class ConfiguredClass {
|
||||||
resolveEmbeddable( attributeName, attributeType, annotations );
|
resolveEmbeddable( attributeName, attributeType, annotations );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// OneToOne, OneToMany, ManyToOne, ManyToMany
|
|
||||||
case ONE_TO_ONE:
|
case ONE_TO_ONE:
|
||||||
case MANY_TO_ONE: {
|
case MANY_TO_ONE: {
|
||||||
final AssociationAttribute attribute = AssociationAttribute.createAssociationAttribute(
|
final AssociationAttribute attribute = AssociationAttribute.createAssociationAttribute(
|
||||||
|
@ -504,6 +498,8 @@ public class ConfiguredClass {
|
||||||
associationAttributeMap.put( attributeName, attribute );
|
associationAttributeMap.put( attributeName, attribute );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ELEMENT_COLLECTION_BASIC:
|
||||||
|
case ELEMENT_COLLECTION_EMBEDDABLE:
|
||||||
case ONE_TO_MANY:
|
case ONE_TO_MANY:
|
||||||
case MANY_TO_MANY: {
|
case MANY_TO_MANY: {
|
||||||
AssociationAttribute attribute = PluralAssociationAttribute.createPluralAssociationAttribute(
|
AssociationAttribute attribute = PluralAssociationAttribute.createPluralAssociationAttribute(
|
||||||
|
@ -609,12 +605,13 @@ public class ConfiguredClass {
|
||||||
JPADotNames.ELEMENT_COLLECTION
|
JPADotNames.ELEMENT_COLLECTION
|
||||||
);
|
);
|
||||||
if ( elementCollection != null ) {
|
if ( elementCollection != null ) {
|
||||||
|
// class info can be null for types like string, etc where there are no annotations
|
||||||
ClassInfo classInfo = getLocalBindingContext().getIndex().getClassByName(
|
ClassInfo classInfo = getLocalBindingContext().getIndex().getClassByName(
|
||||||
DotName.createSimple(
|
DotName.createSimple(
|
||||||
referencedCollectionType.getName()
|
referencedCollectionType.getName()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
if ( classInfo.annotations().get( JPADotNames.EMBEDDABLE ) != null ) {
|
if ( classInfo != null && classInfo.annotations().get( JPADotNames.EMBEDDABLE ) != null ) {
|
||||||
discoveredAttributeTypes.put( MappedAttribute.Nature.ELEMENT_COLLECTION_EMBEDDABLE, elementCollection );
|
discoveredAttributeTypes.put( MappedAttribute.Nature.ELEMENT_COLLECTION_EMBEDDABLE, elementCollection );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -54,12 +54,10 @@ public class OneToManyBindingTest extends BaseAnnotationBindingTestCase {
|
||||||
|
|
||||||
EntityBinding teamBinding = getEntityBinding( Team.class );
|
EntityBinding teamBinding = getEntityBinding( Team.class );
|
||||||
assertNotNull( teamBinding );
|
assertNotNull( teamBinding );
|
||||||
attributeBinding = teamBinding.locateAttributeBinding( "players" );
|
attributeBinding = teamBinding.locateAttributeBinding( "players" );
|
||||||
assertTrue( attributeBinding.isAssociation() );
|
assertTrue( attributeBinding.isAssociation() );
|
||||||
typeDescriptor = attributeBinding.getHibernateTypeDescriptor();
|
typeDescriptor = attributeBinding.getHibernateTypeDescriptor();
|
||||||
|
|
||||||
PluralAttributeBinding pluralAttributeBinding = PluralAttributeBinding.class.cast( attributeBinding );
|
PluralAttributeBinding pluralAttributeBinding = PluralAttributeBinding.class.cast( attributeBinding );
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ public abstract class AbstractBasicCollectionBindingTests extends BaseUnitTestCa
|
||||||
// TODO: this will fail until HHH-7121 is fixed
|
// TODO: this will fail until HHH-7121 is fixed
|
||||||
//assertTrue( entityBinding.getPrimaryTable().locateColumn( "`name`" ).isUnique() );
|
//assertTrue( entityBinding.getPrimaryTable().locateColumn( "`name`" ).isUnique() );
|
||||||
|
|
||||||
checkResult(
|
assertBasicCollectionBinding(
|
||||||
entityBinding,
|
entityBinding,
|
||||||
metadata.getCollection( EntityWithBasicCollections.class.getName() + ".theBag" ),
|
metadata.getCollection( EntityWithBasicCollections.class.getName() + ".theBag" ),
|
||||||
BagType.class,
|
BagType.class,
|
||||||
|
@ -105,7 +105,7 @@ public abstract class AbstractBasicCollectionBindingTests extends BaseUnitTestCa
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
checkResult(
|
assertBasicCollectionBinding(
|
||||||
entityBinding,
|
entityBinding,
|
||||||
metadata.getCollection( EntityWithBasicCollections.class.getName() + ".theSet" ),
|
metadata.getCollection( EntityWithBasicCollections.class.getName() + ".theSet" ),
|
||||||
SetType.class,
|
SetType.class,
|
||||||
|
@ -118,13 +118,13 @@ public abstract class AbstractBasicCollectionBindingTests extends BaseUnitTestCa
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
checkResult(
|
assertBasicCollectionBinding(
|
||||||
entityBinding,
|
entityBinding,
|
||||||
metadata.getCollection( EntityWithBasicCollections.class.getName() + ".thePropertyRefSet" ),
|
metadata.getCollection( EntityWithBasicCollections.class.getName() + ".thePropertyRefSet" ),
|
||||||
SetType.class,
|
SetType.class,
|
||||||
Set.class,
|
Set.class,
|
||||||
Integer.class,
|
Integer.class,
|
||||||
(SingularAttributeBinding ) entityBinding.locateAttributeBinding( "name" ),
|
( SingularAttributeBinding ) entityBinding.locateAttributeBinding( "name" ),
|
||||||
Identifier.toIdentifier( "EntityWithBasicCollections_thePropertyRefSet" ),
|
Identifier.toIdentifier( "EntityWithBasicCollections_thePropertyRefSet" ),
|
||||||
Identifier.toIdentifier( "pid" ),
|
Identifier.toIdentifier( "pid" ),
|
||||||
FetchTiming.DELAYED,
|
FetchTiming.DELAYED,
|
||||||
|
@ -132,7 +132,7 @@ public abstract class AbstractBasicCollectionBindingTests extends BaseUnitTestCa
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <X extends CollectionType> void checkResult(
|
private <X extends CollectionType> void assertBasicCollectionBinding(
|
||||||
EntityBinding collectionOwnerBinding,
|
EntityBinding collectionOwnerBinding,
|
||||||
PluralAttributeBinding collectionBinding,
|
PluralAttributeBinding collectionBinding,
|
||||||
Class<X> expectedCollectionTypeClass,
|
Class<X> expectedCollectionTypeClass,
|
||||||
|
|
|
@ -26,7 +26,6 @@ package org.hibernate.metamodel.spi.binding.basiccollections;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.hibernate.metamodel.MetadataSources;
|
import org.hibernate.metamodel.MetadataSources;
|
||||||
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Hardy Ferentschik
|
* @author Hardy Ferentschik
|
||||||
|
@ -37,7 +36,6 @@ public class AnnotationBasicCollectionBindingTests extends AbstractBasicCollecti
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@FailureExpectedWithNewMetamodel
|
|
||||||
public void testBasicCollections() {
|
public void testBasicCollections() {
|
||||||
super.testBasicCollections();
|
super.testBasicCollections();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,15 @@ import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import javax.persistence.Column;
|
||||||
import javax.persistence.ElementCollection;
|
import javax.persistence.ElementCollection;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.LazyCollection;
|
||||||
|
import org.hibernate.annotations.LazyCollectionOption;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gail Badner
|
* @author Gail Badner
|
||||||
|
@ -64,6 +70,7 @@ public class EntityWithBasicCollections {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Column(unique = true)
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -72,7 +79,8 @@ public class EntityWithBasicCollections {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ElementCollection
|
@ElementCollection(fetch = FetchType.EAGER)
|
||||||
|
@JoinColumn(name = "owner_id")
|
||||||
public Collection<String> getTheBag() {
|
public Collection<String> getTheBag() {
|
||||||
return theBag;
|
return theBag;
|
||||||
}
|
}
|
||||||
|
@ -82,6 +90,8 @@ public class EntityWithBasicCollections {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ElementCollection
|
@ElementCollection
|
||||||
|
@LazyCollection(value = LazyCollectionOption.EXTRA)
|
||||||
|
@JoinColumn(name = "pid")
|
||||||
public Set<String> getTheSet() {
|
public Set<String> getTheSet() {
|
||||||
return theSet;
|
return theSet;
|
||||||
}
|
}
|
||||||
|
@ -91,6 +101,8 @@ public class EntityWithBasicCollections {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ElementCollection
|
@ElementCollection
|
||||||
|
@JoinColumn(name = "pid", referencedColumnName = "name")
|
||||||
|
@Column(name="property_ref_set_stuff", nullable = false)
|
||||||
public Set<Integer> getThePropertyRefSet() {
|
public Set<Integer> getThePropertyRefSet() {
|
||||||
return thePropertyRefSet;
|
return thePropertyRefSet;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue