HHH-6251 : Create CollectionEement subclasses
This commit is contained in:
parent
9b48cd993e
commit
6d5ed5fc5e
|
@ -31,8 +31,8 @@ import org.hibernate.metamodel.binding.state.PluralAttributeBindingState;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class BagBinding extends PluralAttributeBinding {
|
public class BagBinding extends PluralAttributeBinding {
|
||||||
protected BagBinding(EntityBinding entityBinding) {
|
protected BagBinding(EntityBinding entityBinding, CollectionElementType collectionElementType) {
|
||||||
super( entityBinding );
|
super( entityBinding, collectionElementType );
|
||||||
}
|
}
|
||||||
|
|
||||||
public BagBinding initialize(PluralAttributeBindingState bindingState) {
|
public BagBinding initialize(PluralAttributeBindingState bindingState) {
|
||||||
|
|
|
@ -30,17 +30,22 @@ import org.hibernate.metamodel.relational.Value;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class CollectionElement {
|
public abstract class CollectionElement {
|
||||||
|
|
||||||
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
|
private final HibernateTypeDescriptor hibernateTypeDescriptor = new HibernateTypeDescriptor();
|
||||||
private final PluralAttributeBinding collectionBinding;
|
private final PluralAttributeBinding collectionBinding;
|
||||||
|
private final CollectionElementType collectionElementType;
|
||||||
private String nodeName;
|
private String nodeName;
|
||||||
|
|
||||||
private Value elementValue;
|
private Value elementValue;
|
||||||
|
|
||||||
CollectionElement(PluralAttributeBinding collectionBinding) {
|
CollectionElement(PluralAttributeBinding collectionBinding, CollectionElementType collectionElementType) {
|
||||||
this.collectionBinding = collectionBinding;
|
this.collectionBinding = collectionBinding;
|
||||||
|
this.collectionElementType = collectionElementType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final CollectionElementType getCollectionElementType() {
|
||||||
|
return collectionElementType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* package-protected */
|
/* package-protected */
|
||||||
|
@ -52,4 +57,13 @@ public class CollectionElement {
|
||||||
void setNodeName(String nodeName) {
|
void setNodeName(String nodeName) {
|
||||||
this.nodeName = nodeName;
|
this.nodeName = nodeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isOneToMany() {
|
||||||
|
return collectionElementType.isOneToMany();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isManyToMany() {
|
||||||
|
return collectionElementType.isManyToMany();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, 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.binding;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
public enum CollectionElementType {
|
||||||
|
ELEMENT( "element" ) {
|
||||||
|
public CollectionElement createCollectionElementInternal(PluralAttributeBinding attributeBinding) {
|
||||||
|
return new ElementCollectionElement( attributeBinding );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
COMPOSITE_ELEMENT( "composite-element" ) {
|
||||||
|
public CollectionElement createCollectionElementInternal(PluralAttributeBinding attributeBinding) {
|
||||||
|
return new ElementCollectionElement( attributeBinding );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ONE_TO_MANY( "one-to-many" ) {
|
||||||
|
public boolean isOneToMany() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public CollectionElement createCollectionElementInternal(PluralAttributeBinding attributeBinding) {
|
||||||
|
return new OneToManyCollectionElement( attributeBinding );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MANY_TO_MANY( "many-to-many" ) {
|
||||||
|
public boolean isManyToMany() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public CollectionElement createCollectionElementInternal(PluralAttributeBinding attributeBinding) {
|
||||||
|
return new ManyToManyCollectionElement( attributeBinding );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MANY_TO_ANY( "many-to-any" ) {
|
||||||
|
//TODO: should isManyToMany() return true?
|
||||||
|
public boolean isManyToAny() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public CollectionElement createCollectionElementInternal(PluralAttributeBinding attributeBinding) {
|
||||||
|
return new ManyToAnyCollectionElement( attributeBinding );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private CollectionElementType(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return super.toString() + "[" + getName() + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOneToMany() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isManyToMany() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isManyToAny() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract CollectionElement createCollectionElementInternal(PluralAttributeBinding attributeBinding);
|
||||||
|
|
||||||
|
/* package-protected */
|
||||||
|
CollectionElement createCollectionElement(PluralAttributeBinding attributeBinding) {
|
||||||
|
CollectionElement collectionElement = createCollectionElementInternal( attributeBinding );
|
||||||
|
if ( collectionElement.getCollectionElementType() != this ) {
|
||||||
|
throw new IllegalStateException( "Collection element has unexpected type nature: actual=[" +
|
||||||
|
collectionElement.getCollectionElementType() + "; expected=[" + this + "]" );
|
||||||
|
}
|
||||||
|
return collectionElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -30,6 +30,6 @@ import org.dom4j.Element;
|
||||||
*/
|
*/
|
||||||
public class ElementCollectionElement extends CollectionElement {
|
public class ElementCollectionElement extends CollectionElement {
|
||||||
public ElementCollectionElement(PluralAttributeBinding binding) {
|
public ElementCollectionElement(PluralAttributeBinding binding) {
|
||||||
super( binding );
|
super( binding, CollectionElementType.ELEMENT );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,8 +270,8 @@ public class EntityBinding {
|
||||||
return binding;
|
return binding;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BagBinding makeBagAttributeBinding(String attributeName) {
|
public BagBinding makeBagAttributeBinding(String attributeName, CollectionElementType collectionElementType) {
|
||||||
final BagBinding binding = new BagBinding( this );
|
final BagBinding binding = new BagBinding( this, collectionElementType );
|
||||||
registerAttributeBinding( attributeName, binding );
|
registerAttributeBinding( attributeName, binding );
|
||||||
binding.setAttribute( entity.getAttribute( attributeName ) );
|
binding.setAttribute( entity.getAttribute( attributeName ) );
|
||||||
return binding;
|
return binding;
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, 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.binding;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.dom4j.Element;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
public class ManyToAnyCollectionElement extends CollectionElement {
|
||||||
|
ManyToAnyCollectionElement(PluralAttributeBinding binding) {
|
||||||
|
super( binding, CollectionElementType.MANY_TO_ANY );
|
||||||
|
}
|
||||||
|
}
|
|
@ -36,8 +36,8 @@ public class ManyToManyCollectionElement extends CollectionElement {
|
||||||
private String manyToManyOrderBy;
|
private String manyToManyOrderBy;
|
||||||
|
|
||||||
|
|
||||||
ManyToManyCollectionElement(Element collectionNode, PluralAttributeBinding binding) {
|
ManyToManyCollectionElement(PluralAttributeBinding binding) {
|
||||||
super( binding );
|
super( binding, CollectionElementType.MANY_TO_MANY );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fromHbmXml(Element node){
|
public void fromHbmXml(Element node){
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, 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.binding;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
public class OneToManyCollectionElement extends CollectionElement {
|
||||||
|
|
||||||
|
OneToManyCollectionElement(PluralAttributeBinding binding) {
|
||||||
|
super( binding, CollectionElementType.ONE_TO_MANY );
|
||||||
|
}
|
||||||
|
}
|
|
@ -79,9 +79,9 @@ public abstract class PluralAttributeBinding extends AbstractAttributeBinding {
|
||||||
|
|
||||||
private String loaderName;
|
private String loaderName;
|
||||||
|
|
||||||
protected PluralAttributeBinding(EntityBinding entityBinding) {
|
protected PluralAttributeBinding(EntityBinding entityBinding, CollectionElementType collectionElementType) {
|
||||||
super( entityBinding );
|
super( entityBinding );
|
||||||
collectionElement = new CollectionElement( this );
|
collectionElement = collectionElementType.createCollectionElement( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initializeBinding(PluralAttributeBindingState state) {
|
protected void initializeBinding(PluralAttributeBindingState state) {
|
||||||
|
|
|
@ -25,6 +25,7 @@ package org.hibernate.metamodel.source.hbm;
|
||||||
|
|
||||||
import org.dom4j.Attribute;
|
import org.dom4j.Attribute;
|
||||||
|
|
||||||
|
import org.hibernate.AssertionFailure;
|
||||||
import org.hibernate.EntityMode;
|
import org.hibernate.EntityMode;
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.cfg.NamingStrategy;
|
import org.hibernate.cfg.NamingStrategy;
|
||||||
|
@ -32,6 +33,7 @@ import org.hibernate.engine.internal.Versioning;
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.metamodel.binding.AttributeBinding;
|
import org.hibernate.metamodel.binding.AttributeBinding;
|
||||||
import org.hibernate.metamodel.binding.BagBinding;
|
import org.hibernate.metamodel.binding.BagBinding;
|
||||||
|
import org.hibernate.metamodel.binding.CollectionElementType;
|
||||||
import org.hibernate.metamodel.binding.EntityBinding;
|
import org.hibernate.metamodel.binding.EntityBinding;
|
||||||
import org.hibernate.metamodel.binding.ManyToOneAttributeBinding;
|
import org.hibernate.metamodel.binding.ManyToOneAttributeBinding;
|
||||||
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
|
import org.hibernate.metamodel.binding.SimpleAttributeBinding;
|
||||||
|
@ -489,13 +491,36 @@ PrimitiveArray
|
||||||
entityBinding.getMetaAttributes()
|
entityBinding.getMetaAttributes()
|
||||||
);
|
);
|
||||||
|
|
||||||
BagBinding collectionBinding = entityBinding.makeBagAttributeBinding( bindingState.getAttributeName() )
|
BagBinding collectionBinding = entityBinding.makeBagAttributeBinding(
|
||||||
|
bindingState.getAttributeName(),
|
||||||
|
getCollectionElementType( collection ) )
|
||||||
.initialize( bindingState );
|
.initialize( bindingState );
|
||||||
|
|
||||||
// todo : relational model binding
|
// todo : relational model binding
|
||||||
return collectionBinding;
|
return collectionBinding;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CollectionElementType getCollectionElementType(XMLBagElement collection) {
|
||||||
|
if ( collection.getElement() != null ) {
|
||||||
|
return CollectionElementType.ELEMENT;
|
||||||
|
}
|
||||||
|
else if ( collection.getCompositeElement() != null ) {
|
||||||
|
return CollectionElementType.COMPOSITE_ELEMENT;
|
||||||
|
}
|
||||||
|
else if ( collection.getManyToMany() != null ) {
|
||||||
|
return CollectionElementType.MANY_TO_MANY;
|
||||||
|
}
|
||||||
|
else if ( collection.getOneToMany() != null ) {
|
||||||
|
return CollectionElementType.ONE_TO_MANY;
|
||||||
|
}
|
||||||
|
else if ( collection.getManyToAny() != null ) {
|
||||||
|
return CollectionElementType.MANY_TO_ANY;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new AssertionFailure( "Unknown collection element type: " + collection );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ManyToOneAttributeBinding makeManyToOneAttributeBinding(XMLManyToOneElement manyToOne,
|
private ManyToOneAttributeBinding makeManyToOneAttributeBinding(XMLManyToOneElement manyToOne,
|
||||||
EntityBinding entityBinding) {
|
EntityBinding entityBinding) {
|
||||||
ManyToOneAttributeBindingState bindingState =
|
ManyToOneAttributeBindingState bindingState =
|
||||||
|
|
Loading…
Reference in New Issue