HHH-7164 - Finish out SessionFactoryBuilder api;

HHH-8934 - MetadataSources needs to index (Jandex) classes referenced in xml files
This commit is contained in:
Steve Ebersole 2014-02-05 00:27:02 -06:00
parent a2971e4f75
commit 79368d2c39
56 changed files with 1259 additions and 1030 deletions

View File

@ -85,6 +85,10 @@ public interface SessionFactory extends Referenceable, Serializable {
* @return The specific EntityNotFoundDelegate to use, May be {@code null}
*/
public EntityNotFoundDelegate getEntityNotFoundDelegate();
public Object getBeanManagerReference();
public Object getValidatorFactoryReference();
}
/**

View File

@ -53,7 +53,6 @@ import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Selectable;
import org.hibernate.mapping.SingleTableSubclass;
@ -73,8 +72,6 @@ class TypeSafeActivator {
private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, TypeSafeActivator.class.getName());
private static final String FACTORY_PROPERTY = "javax.persistence.validation.factory";
/**
* Used to validate a supplied ValidatorFactory instance as being castable to ValidatorFactory.
*
@ -95,7 +92,7 @@ class TypeSafeActivator {
final Map properties = activationContext.getSettings();
final ValidatorFactory factory;
try {
factory = getValidatorFactory( properties );
factory = getValidatorFactory( activationContext );
}
catch (IntegrationException e) {
if ( activationContext.getValidationModes().contains( ValidationMode.CALLBACK ) ) {
@ -453,30 +450,26 @@ class TypeSafeActivator {
return false;
}
private static ValidatorFactory getValidatorFactory(Map properties) {
ValidatorFactory factory = null;
if ( properties != null ) {
Object unsafeProperty = properties.get( FACTORY_PROPERTY );
if ( unsafeProperty != null ) {
try {
factory = ValidatorFactory.class.cast( unsafeProperty );
}
catch ( ClassCastException e ) {
throw new IntegrationException(
"Property " + FACTORY_PROPERTY
+ " should contain an object of type " + ValidatorFactory.class.getName()
);
}
}
}
if ( factory == null ) {
private static ValidatorFactory getValidatorFactory(ActivationContext activationContext) {
// first look for an explicitly passed ValidatorFactory
final Object reference = activationContext.getSessionFactory().getSessionFactoryOptions().getValidatorFactoryReference();
if ( reference != null ) {
try {
factory = Validation.buildDefaultValidatorFactory();
return ValidatorFactory.class.cast( reference );
}
catch ( Exception e ) {
throw new IntegrationException( "Unable to build the default ValidatorFactory", e );
catch ( ClassCastException e ) {
throw new IntegrationException(
"Passed ValidatorFactory was not of correct type; expected " + ValidatorFactory.class.getName() +
", but found " + reference.getClass().getName()
);
}
}
return factory;
try {
return Validation.buildDefaultValidatorFactory();
}
catch ( Exception e ) {
throw new IntegrationException( "Unable to build the default ValidatorFactory", e );
}
}
}

View File

@ -0,0 +1,44 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2014, 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.internal;
import java.io.Serializable;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.proxy.EntityNotFoundDelegate;
/**
* @author Steve Ebersole
*/
public class StandardEntityNotFoundDelegate implements EntityNotFoundDelegate {
/**
* Singleton access
*/
public static final StandardEntityNotFoundDelegate INSTANCE = new StandardEntityNotFoundDelegate();
@Override
public void handleEntityNotFound(String entityName, Serializable id) {
throw new ObjectNotFoundException( id, entityName );
}
}

View File

@ -96,6 +96,10 @@ public interface MetadataBuilder {
/**
* Allows specifying a specific Jandex index to use for reading annotation information.
* <p/>
* It is <i>important</i> to understand that if a Jandex index is passed in, it is expected that
* this Jandex index already contains all entries for all classes. No additional indexing will be
* done in this case.
*
* @param jandexView The Jandex index to use.
*

View File

@ -32,6 +32,7 @@ import java.io.InputStream;
import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.LinkedHashSet;
@ -39,7 +40,6 @@ import java.util.List;
import java.util.Set;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import javax.persistence.AttributeConverter;
import org.hibernate.HibernateException;
@ -47,15 +47,20 @@ import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.spi.CacheRegionDefinition;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.internal.util.SerializationHelper;
import org.hibernate.xml.internal.jaxb.MappingXmlBinder;
import org.hibernate.xml.spi.BindResult;
import org.hibernate.xml.spi.Origin;
import org.hibernate.xml.spi.SourceType;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.jaxb.spi.hbm.JaxbClassElement;
import org.hibernate.jaxb.spi.hbm.JaxbHibernateMapping;
import org.hibernate.jaxb.spi.hbm.JaxbJoinedSubclassElement;
import org.hibernate.jaxb.spi.hbm.JaxbSubclassElement;
import org.hibernate.jaxb.spi.hbm.JaxbUnionSubclassElement;
import org.hibernate.jaxb.spi.orm.JaxbConverter;
import org.hibernate.jaxb.spi.orm.JaxbEmbeddable;
import org.hibernate.jaxb.spi.orm.JaxbEntity;
import org.hibernate.jaxb.spi.orm.JaxbEntityMappings;
import org.hibernate.jaxb.spi.orm.JaxbMappedSuperclass;
import org.hibernate.metamodel.internal.MetadataBuilderImpl;
import org.hibernate.metamodel.internal.source.annotations.util.HibernateDotNames;
import org.hibernate.metamodel.internal.source.annotations.util.JPADotNames;
@ -66,11 +71,20 @@ import org.hibernate.metamodel.spi.source.MappingException;
import org.hibernate.metamodel.spi.source.MappingNotFoundException;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.SerializationException;
import org.hibernate.xml.internal.jaxb.MappingXmlBinder;
import org.hibernate.xml.spi.BindResult;
import org.hibernate.xml.spi.Origin;
import org.hibernate.xml.spi.SourceType;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.CompositeIndex;
import org.jboss.jandex.DotName;
import org.jboss.jandex.IndexView;
import org.jboss.jandex.Indexer;
import org.jboss.jandex.Type;
import org.jboss.logging.Logger;
import org.w3c.dom.Document;
/**
@ -289,6 +303,16 @@ public class MetadataSources {
return this;
}
private List<Class<? extends AttributeConverter>> converterClasses;
public MetadataSources addAttributeConverter(Class<? extends AttributeConverter> converterClass) {
if ( converterClasses == null ) {
converterClasses = new ArrayList<Class<? extends AttributeConverter>>();
}
converterClasses.add( converterClass );
return this;
}
/**
* Read mappings from a particular XML file
*
@ -567,15 +591,21 @@ public class MetadataSources {
public IndexView buildJandexView(boolean autoIndexMemberTypes) {
// create a jandex index from the annotated classes
Indexer indexer = new Indexer();
final Indexer indexer = new Indexer();
Set<Class<?>> processedClasses = new HashSet<Class<?>>();
Set<String> processedClassNames = new HashSet<String>();
for ( Class<?> clazz : getAnnotatedClasses() ) {
indexClass( clazz, indexer, processedClasses, autoIndexMemberTypes );
indexClass( clazz, indexer, processedClassNames, autoIndexMemberTypes );
}
if ( converterClasses != null ) {
for ( Class<? extends AttributeConverter> converterClass : converterClasses ) {
indexClass( converterClass, indexer, processedClassNames, autoIndexMemberTypes );
}
}
for ( String className : getAnnotatedClassNames() ) {
indexResource( className.replace( '.', '/' ) + ".class", indexer );
indexClassName( DotName.createSimple( className ), indexer, processedClassNames, autoIndexMemberTypes );
}
// add package-info from the configured packages
@ -583,59 +613,257 @@ public class MetadataSources {
indexResource( packageName.replace( '.', '/' ) + "/package-info.class", indexer );
}
return wrapJandexView( indexer.complete() );
// the classes referenced in any xml bindings
for ( BindResult bindResult : bindResultList ) {
if ( JaxbHibernateMapping.class.isInstance( bindResult.getRoot() ) ) {
indexHbmReferences( (JaxbHibernateMapping) bindResult.getRoot(), indexer, processedClassNames );
}
else {
final JaxbEntityMappings ormXmlRoot = (JaxbEntityMappings) bindResult.getRoot();
if ( !isMappingMetadataComplete( ormXmlRoot ) ) {
indexOrmXmlReferences( ormXmlRoot, indexer, processedClassNames );
}
}
}
IndexView jandexView = indexer.complete();
Collection<AnnotationInstance> entityListenerAnnotations = jandexView.getAnnotations( JPADotNames.ENTITY_LISTENERS );
if ( entityListenerAnnotations != null ) {
Indexer entityListenerIndexer = new Indexer();
for ( AnnotationInstance entityListenerAnnotation : entityListenerAnnotations ) {
final Type[] entityListenerClassTypes = entityListenerAnnotation.value().asClassArray();
for ( Type entityListenerClassType : entityListenerClassTypes ) {
indexClassName(
entityListenerClassType.name(),
entityListenerIndexer,
processedClassNames,
autoIndexMemberTypes
);
}
}
jandexView = CompositeIndex.create( jandexView, entityListenerIndexer.complete() );
}
return wrapJandexView( jandexView );
}
private void indexClass(Class clazz, Indexer indexer, Set<Class<?>> processedClasses, boolean autoIndexMemberTypes) {
if ( clazz == null || clazz == Object.class
|| processedClasses.contains( clazz ) ) {
private boolean isMappingMetadataComplete(JaxbEntityMappings ormXmlRoot) {
return ormXmlRoot.getPersistenceUnitMetadata() != null
&& ormXmlRoot.getPersistenceUnitMetadata().getXmlMappingMetadataComplete() == null;
}
private void indexOrmXmlReferences(JaxbEntityMappings ormXmlRoot, Indexer indexer, Set<String> processedClassNames) {
final String packageName = ormXmlRoot.getPackage();
for ( JaxbConverter jaxbConverter : ormXmlRoot.getConverter() ) {
indexClassName(
toDotName( jaxbConverter.getClazz(), packageName ),
indexer,
processedClassNames,
false
);
}
for ( JaxbEmbeddable jaxbEmbeddable : ormXmlRoot.getEmbeddable() ) {
indexClassName(
toDotName( jaxbEmbeddable.getClazz(), packageName ),
indexer,
processedClassNames,
false
);
}
for ( JaxbMappedSuperclass jaxbMappedSuperclass : ormXmlRoot.getMappedSuperclass() ) {
indexClassName(
toDotName( jaxbMappedSuperclass.getClazz(), packageName ),
indexer,
processedClassNames,
false
);
}
for ( JaxbEntity jaxbEntity : ormXmlRoot.getEntity() ) {
indexClassName(
toDotName( jaxbEntity.getClazz(), packageName ),
indexer,
processedClassNames,
false
);
}
}
private DotName toDotName(String className, String packageName) {
if ( StringHelper.isNotEmpty( packageName ) ) {
if ( !className.contains( "." ) ) {
return DotName.createSimple( packageName + '.' + className );
}
}
return DotName.createSimple( className );
}
private void indexHbmReferences(JaxbHibernateMapping hbmRoot, Indexer indexer, Set<String> processedClassNames) {
final String packageName = hbmRoot.getPackage();
for ( JaxbClassElement hbmRootClass : hbmRoot.getClazz() ) {
if ( StringHelper.isNotEmpty( hbmRootClass.getName() ) ) {
indexClassName(
toDotName( hbmRootClass.getName(), packageName ),
indexer,
processedClassNames,
false
);
for ( JaxbSubclassElement hbmSubclassElement : hbmRootClass.getSubclass() ) {
processHbmSubclass( hbmSubclassElement, indexer, processedClassNames, packageName );
}
for ( JaxbJoinedSubclassElement hbmJoinedSubclass : hbmRootClass.getJoinedSubclass() ) {
processHbmJoinedSubclass( hbmJoinedSubclass, indexer, processedClassNames, packageName );
}
for ( JaxbUnionSubclassElement hbmUnionSubclass : hbmRoot.getUnionSubclass() ) {
processHbmUnionSubclass( hbmUnionSubclass, indexer, processedClassNames, packageName );
}
}
}
for ( JaxbSubclassElement hbmSubclassElement : hbmRoot.getSubclass() ) {
if ( StringHelper.isNotEmpty( hbmSubclassElement.getName() ) ) {
processHbmSubclass( hbmSubclassElement, indexer, processedClassNames, packageName );
}
}
for ( JaxbJoinedSubclassElement hbmJoinedSubclass : hbmRoot.getJoinedSubclass() ) {
if ( StringHelper.isNotEmpty( hbmJoinedSubclass.getName() ) ) {
processHbmJoinedSubclass( hbmJoinedSubclass, indexer, processedClassNames, packageName );
}
}
for ( JaxbUnionSubclassElement hbmUnionSubclass : hbmRoot.getUnionSubclass() ) {
if ( StringHelper.isNotEmpty( hbmUnionSubclass.getName() ) ) {
processHbmUnionSubclass( hbmUnionSubclass, indexer, processedClassNames, packageName );
}
}
}
private void processHbmSubclass(
JaxbSubclassElement hbmSubclassElement,
Indexer indexer,
Set<String> processedClassNames,
String packageName) {
indexClassName(
toDotName( hbmSubclassElement.getName(), packageName ),
indexer,
processedClassNames,
false
);
for ( JaxbSubclassElement hbmSubclassElement2 : hbmSubclassElement.getSubclass() ) {
processHbmSubclass( hbmSubclassElement2, indexer, processedClassNames, packageName );
}
}
private void processHbmJoinedSubclass(
JaxbJoinedSubclassElement hbmJoinedSubclass,
Indexer indexer,
Set<String> processedClassNames,
String packageName) {
indexClassName(
toDotName( hbmJoinedSubclass.getName(), packageName ),
indexer,
processedClassNames,
false
);
for ( JaxbJoinedSubclassElement hbmJoinedSubclass2 : hbmJoinedSubclass.getJoinedSubclass() ) {
processHbmJoinedSubclass( hbmJoinedSubclass2, indexer, processedClassNames, packageName );
}
}
private void processHbmUnionSubclass(
JaxbUnionSubclassElement hbmUnionSubclass,
Indexer indexer,
Set<String> processedClassNames,
String packageName) {
indexClassName(
toDotName( hbmUnionSubclass.getName(), packageName ),
indexer,
processedClassNames,
false
);
for ( JaxbUnionSubclassElement hbmUnionSubclass2 : hbmUnionSubclass.getUnionSubclass() ) {
processHbmUnionSubclass( hbmUnionSubclass2, indexer, processedClassNames, packageName );
}
}
private final DotName OBJECT_DOT_NAME = DotName.createSimple( Object.class.getName() );
private void indexClassName(DotName classDotName, Indexer indexer, Set<String> processedClassNames, boolean autoIndexMemberTypes) {
if ( classDotName == null || OBJECT_DOT_NAME.equals( classDotName ) || processedClassNames.contains( classDotName.toString() ) ) {
return;
}
processedClasses.add( clazz );
ClassInfo classInfo = indexResource(
clazz.getName().replace( '.', '/' ) + ".class", indexer );
processedClassNames.add( classDotName.toString() );
ClassInfo classInfo = indexResource( classDotName.toString().replace( '.', '/' ) + ".class", indexer );
if ( classInfo.superName() != null ) {
indexClassName( classInfo.superName(), indexer, processedClassNames, autoIndexMemberTypes );
}
}
private void indexClass(Class clazz, Indexer indexer, Set<String> processedClassNames, boolean autoIndexMemberTypes) {
if ( clazz == null || clazz == Object.class || processedClassNames.contains( clazz.getName() ) ) {
return;
}
processedClassNames.add( clazz.getName() );
ClassInfo classInfo = indexResource( clazz.getName().replace( '.', '/' ) + ".class", indexer );
// index all super classes of the specified class. Using org.hibernate.cfg.Configuration it was not
// necessary to add all annotated classes. Entities would be enough. Mapped superclasses would be
// discovered while processing the annotations. To keep this behavior we index all classes in the
// hierarchy (see also HHH-7484)
indexClass( clazz.getSuperclass(), indexer, processedClasses, autoIndexMemberTypes );
indexClass( clazz.getSuperclass(), indexer, processedClassNames, autoIndexMemberTypes );
// Similarly, index any inner class.
for ( Class innerClass : clazz.getDeclaredClasses() ) {
indexClass( innerClass, indexer, processedClasses, autoIndexMemberTypes );
indexClass( innerClass, indexer, processedClassNames, autoIndexMemberTypes );
}
if ( autoIndexMemberTypes ) {
// If autoIndexMemberTypes, don't require @Embeddable
// classes to be explicitly identified.
// Automatically find them by checking the fields' types.
for ( Class<?> fieldType : ReflectHelper.getMemberTypes( clazz ) ) {
// this is NOT how this should be done. Lot of overhead here. Instead we should process them after
// the Index is built. See how EntityListeners are handled, as a "post process"
final ClassLoaderService classLoaderService = serviceRegistry.getService( ClassLoaderService.class );
for ( Class<?> fieldType : ReflectHelper.getMemberTypes( clazz ) ) {
if ( !fieldType.isPrimitive() && fieldType != Object.class ) {
try {
IndexView fieldIndex = JandexHelper.indexForClass(
serviceRegistry.getService( ClassLoaderService.class ),
fieldType );
if ( !fieldIndex.getAnnotations(
JPADotNames.EMBEDDABLE ).isEmpty() ) {
indexClass( fieldType, indexer, processedClasses, autoIndexMemberTypes );
IndexView fieldIndex = JandexHelper.indexForClass( classLoaderService, fieldType );
if ( !fieldIndex.getAnnotations( JPADotNames.EMBEDDABLE ).isEmpty() ) {
indexClass( fieldType, indexer, processedClassNames, true );
}
} catch ( Exception e ) {
}
catch ( Exception e ) {
// do nothing
}
}
}
// Also check for classes within a @Target annotation.
for ( AnnotationInstance targetAnnotation : JandexHelper.getAnnotations(
classInfo, HibernateDotNames.TARGET ) ) {
String targetClassName = targetAnnotation.value().asClass().name()
.toString();
Class<?> targetClass = serviceRegistry.getService(
ClassLoaderService.class ).classForName( targetClassName );
indexClass(targetClass, indexer, processedClasses, autoIndexMemberTypes );
for ( AnnotationInstance targetAnnotation : JandexHelper.getAnnotations( classInfo, HibernateDotNames.TARGET ) ) {
String targetClassName = targetAnnotation.value().asClass().name().toString();
Class<?> targetClass = classLoaderService.classForName( targetClassName );
indexClass( targetClass, indexer, processedClassNames, true );
}
}
}
@ -655,12 +883,4 @@ public class MetadataSources {
return null;
}
public void addAttributeConverter(Class<? extends AttributeConverter> cls) {
}
public void addAttributeConverter(Class<? extends AttributeConverter> theClass, boolean autoApply) {
}
}

View File

@ -31,6 +31,7 @@ import org.hibernate.SessionFactory;
import org.hibernate.SessionFactoryObserver;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.secure.spi.JaccPermissionDeclarations;
import org.hibernate.tuple.entity.EntityTuplizer;
/**
@ -116,6 +117,24 @@ public interface SessionFactoryBuilder {
*/
public SessionFactoryBuilder with(EntityMode entityMode, Class<? extends EntityTuplizer> tuplizerClass);
/**
* Apply a BeanValidation ValidatorFactory to the SessionFactory being built
*
* @param validatorFactory The ValidatorFactory to use
*
* @return {@code this}, for method chaining
*/
public SessionFactoryBuilder withValidatorFactory(Object validatorFactory);
/**
* Apply a CDI BeanManager to the SessionFactory being built
*
* @param beanManager The BeanManager to use
*
* @return {@code this}, for method chaining
*/
public SessionFactoryBuilder withBeanManager(Object beanManager);
/**
* After all options have been set, build the SessionFactory.
*

View File

@ -47,9 +47,11 @@ import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.internal.DefaultCustomEntityDirtinessStrategy;
import org.hibernate.internal.SessionFactoryImpl;
import org.hibernate.internal.StandardEntityNotFoundDelegate;
import org.hibernate.metamodel.SessionFactoryBuilder;
import org.hibernate.metamodel.spi.MetadataImplementor;
import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.secure.spi.JaccPermissionDeclarations;
import org.hibernate.tuple.entity.EntityTuplizer;
/**
@ -102,11 +104,23 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilder {
}
@Override
public SessionFactoryBuilder with(EntityMode entityMode, Class<? extends EntityTuplizer> tuplizerClass){
public SessionFactoryBuilder with(EntityMode entityMode, Class<? extends EntityTuplizer> tuplizerClass) {
this.options.settings.getEntityTuplizerFactory().registerDefaultTuplizerClass( entityMode, tuplizerClass );
return this;
}
@Override
public SessionFactoryBuilder withValidatorFactory(Object validatorFactory) {
this.options.validatorFactoryReference = validatorFactory;
return this;
}
@Override
public SessionFactoryBuilder withBeanManager(Object beanManager) {
this.options.beanManagerReference = beanManager;
return this;
}
@Override
public SessionFactory build() {
return new SessionFactoryImpl( metadata, options );
@ -122,6 +136,8 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilder {
private List<EntityNameResolver> entityNameResolvers = new ArrayList<EntityNameResolver>();
private EntityNotFoundDelegate entityNotFoundDelegate;
private Settings settings;
public Object beanManagerReference;
public Object validatorFactoryReference;
public SessionFactoryOptionsImpl(StandardServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
@ -136,12 +152,7 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilder {
EmptyInterceptor.INSTANCE
);
// TODO: should there be a DefaultEntityNotFoundDelegate.INSTANCE?
this.entityNotFoundDelegate = new EntityNotFoundDelegate() {
public void handleEntityNotFound(String entityName, Serializable id) {
throw new ObjectNotFoundException( id, entityName );
}
};
this.entityNotFoundDelegate = StandardEntityNotFoundDelegate.INSTANCE;
this.customEntityDirtinessStrategy = strategySelector.resolveDefaultableStrategy(
CustomEntityDirtinessStrategy.class,
@ -153,6 +164,10 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilder {
CurrentTenantIdentifierResolver.class,
configurationSettings.get( AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER )
);
this.beanManagerReference = configurationSettings.get( "javax.persistence.bean.manager" );
this.validatorFactoryReference = configurationSettings.get( "javax.persistence.validation.factory" );
Properties properties = new Properties();
properties.putAll( configurationSettings );
this.settings = new SettingsFactory().buildSettings( properties, serviceRegistry );
@ -197,6 +212,16 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilder {
public EntityNotFoundDelegate getEntityNotFoundDelegate() {
return entityNotFoundDelegate;
}
@Override
public Object getBeanManagerReference() {
return beanManagerReference;
}
@Override
public Object getValidatorFactoryReference() {
return validatorFactoryReference;
}
}
}

View File

@ -388,8 +388,10 @@ public class JandexHelper {
}
public static void throwNotIndexException(String className){
throw new MappingException( "Class " + className +" is not indexed, probably means this class should be explicitly added" +
"into MatadataSources" );
throw new MappingException(
"Class " + className +" is not indexed, probably means this class should be explicitly added " +
"into MatadataSources"
);
}

View File

@ -524,11 +524,10 @@ public class EntityBinding extends AbstractAttributeBindingContainer implements
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "EntityBinding" );
sb.append( "{entity=" ).append( entity != null ? entity.getName() : "not set" );
sb.append( '}' );
return sb.toString();
return String.format(
"EntityBinding(%s)",
entity != null ? StringHelper.collapse( entity.getName() ) : "<not set>"
);
}
public CompositeAttributeBinding makeVirtualCompositeAttributeBinding(

View File

@ -24,6 +24,7 @@
package org.hibernate.secure.spi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@ -37,6 +38,10 @@ public class JaccPermissionDeclarations {
this.contextId = contextId;
}
public String getContextId() {
return contextId;
}
public void addPermissionDeclaration(GrantedPermission permissionDeclaration) {
if ( permissionDeclarations == null ) {
permissionDeclarations = new ArrayList<GrantedPermission>();
@ -44,7 +49,9 @@ public class JaccPermissionDeclarations {
permissionDeclarations.add( permissionDeclaration );
}
public Iterable<GrantedPermission> getPermissionDeclarations() {
return permissionDeclarations;
public List<GrantedPermission> getPermissionDeclarations() {
return permissionDeclarations == null
? Collections.<GrantedPermission>emptyList()
: permissionDeclarations;
}
}

View File

@ -0,0 +1,45 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2014, 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.jpa.boot.internal;
import java.io.Serializable;
import javax.persistence.EntityNotFoundException;
import org.hibernate.proxy.EntityNotFoundDelegate;
/**
* EntityNotFoundDelegate implementation complying with the JPA spec by throwing {@link EntityNotFoundException}.
*
* @author Steve Ebersole
*/
class JpaEntityNotFoundDelegate implements EntityNotFoundDelegate, Serializable {
/**
* Singleton access
*/
public static final JpaEntityNotFoundDelegate INSTANCE = new JpaEntityNotFoundDelegate();
public void handleEntityNotFound(String entityName, Serializable id) {
throw new EntityNotFoundException( "Unable to find " + entityName + " with id " + id );
}
}

View File

@ -35,7 +35,7 @@ import javax.sql.DataSource;
* The second phase is building the EntityManagerFactory instance via {@link #build}.
*
* If anything goes wrong during either phase and the bootstrap process needs to be aborted, {@link #cancel()} should
* be called.
* be called to release resources held between the 2 phases.
*
* @author Steve Ebersole
* @author Scott Marlow

View File

@ -25,7 +25,6 @@ package org.hibernate.jpa.event.spi;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
import org.hibernate.HibernateException;
@ -59,12 +58,10 @@ import org.hibernate.jpa.event.internal.jpa.CallbackProcessor;
import org.hibernate.jpa.event.internal.jpa.CallbackProcessorImpl;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl;
import org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor;
import org.hibernate.jpa.event.internal.jpa.StandardListenerFactory;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.spi.binding.EntityBinding;
import org.hibernate.metamodel.spi.MetadataImplementor;
import org.hibernate.metamodel.spi.binding.EntityBinding;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
@ -242,7 +239,7 @@ public class JpaIntegrator implements Integrator {
// handle JPA "entity listener classes"...
this.callbackRegistry = new CallbackRegistryImpl();
final Object beanManagerRef = sessionFactory.getProperties().get( AvailableSettings.CDI_BEAN_MANAGER );
final Object beanManagerRef = sessionFactory.getSessionFactoryOptions().getBeanManagerReference();
this.jpaListenerFactory = beanManagerRef == null
? new StandardListenerFactory()
: buildBeanManagerListenerFactory( beanManagerRef );

View File

@ -47,159 +47,176 @@ public abstract class AbstractIdentifiableType<X>
implements IdentifiableType<X>, Serializable {
private final boolean hasIdentifierProperty;
private final boolean isVersioned;
private final boolean hasIdClass;
private SingularAttributeImpl<X, ?> id;
private SingularAttributeImpl<X, ?> version;
private Set<SingularAttribute<? super X,?>> idClassAttributes;
private final boolean isVersioned;
private SingularAttributeImpl<X, ?> version;
public AbstractIdentifiableType(
Class<X> javaType,
String typeName,
AbstractIdentifiableType<? super X> superType,
boolean hasIdClass,
boolean hasIdentifierProperty,
boolean versioned) {
super( javaType, superType );
super( javaType, typeName, superType );
this.hasIdClass = hasIdClass;
this.hasIdentifierProperty = hasIdentifierProperty;
isVersioned = versioned;
this.isVersioned = versioned;
}
@Override
@SuppressWarnings("unchecked")
public AbstractIdentifiableType<? super X> getSupertype() {
return ( AbstractIdentifiableType<? super X> ) super.getSupertype();
// overridden simply to perform the cast
return (AbstractIdentifiableType<? super X>) super.getSupertype();
}
/**
* Indicates if a non-null super type is required to provide the
* identifier attribute(s) if this object does not have a declared
* identifier.
* .
* @return true, if a non-null super type is required to provide
* the identifier attribute(s) if this object does not have a
* declared identifier; false, otherwise.
*/
protected abstract boolean requiresSupertypeForNonDeclaredIdentifier();
protected AbstractIdentifiableType<? super X> requireSupertype() {
if ( getSupertype() == null ) {
throw new IllegalStateException( "No supertype found" );
}
return getSupertype();
public boolean hasIdClass() {
return hasIdClass;
}
@Override
public boolean hasSingleIdAttribute() {
return hasIdentifierProperty;
return !hasIdClass() && hasIdentifierProperty;
}
@Override
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<? super X, Y> getId(Class<Y> javaType) {
final SingularAttribute<? super X, Y> id_;
ensureNoIdClass();
SingularAttributeImpl id = locateIdAttribute();
if ( id != null ) {
checkSimpleId();
id_ = ( SingularAttribute<? super X, Y> ) id;
if ( javaType != id.getJavaType() ) {
throw new IllegalArgumentException( "Id attribute was not of specified type : " + javaType.getName() );
}
checkType( id, javaType );
}
else {
//yuk yuk bad me
if ( ! requiresSupertypeForNonDeclaredIdentifier()) {
final AbstractIdentifiableType<? super X> supertype = getSupertype();
if (supertype != null) {
id_ = supertype.getId( javaType );
}
else {
id_ = null;
}
}
else {
id_ = requireSupertype().getId( javaType );
}
}
return id_;
return ( SingularAttribute<? super X, Y> ) id;
}
/**
* Centralized check to ensure the id for this hierarchy is a simple one (i.e., does not use
* an id-class).
*
* @see #checkIdClass()
*/
protected void checkSimpleId() {
if ( ! hasIdentifierProperty ) {
throw new IllegalStateException( "This class uses an @IdClass" );
private void ensureNoIdClass() {
if ( hasIdClass() ) {
throw new IllegalArgumentException(
"Illegal call to IdentifiableType#getId for class [" + getTypeName() + "] defined with @IdClass"
);
}
}
private SingularAttributeImpl locateIdAttribute() {
if ( id != null ) {
return id;
}
else {
if ( getSupertype() != null ) {
SingularAttributeImpl id = getSupertype().internalGetId();
if ( id != null ) {
return id;
}
}
}
return null;
}
protected SingularAttributeImpl internalGetId() {
if ( id != null ) {
return id;
}
else {
if ( getSupertype() != null ) {
return getSupertype().internalGetId();
}
}
return null;
}
@SuppressWarnings("unchecked")
private void checkType(SingularAttributeImpl attribute, Class javaType) {
if ( ! javaType.isAssignableFrom( attribute.getType().getJavaType() ) ) {
throw new IllegalArgumentException(
String.format(
"Attribute [%s#%s : %s] not castable to requested type [%s]",
getTypeName(),
attribute.getName(),
attribute.getType().getJavaType().getName(),
javaType.getName()
)
);
}
}
@Override
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> javaType) {
checkDeclaredId();
checkSimpleId();
if ( javaType != id.getJavaType() ) {
throw new IllegalArgumentException( "Id attribute was not of specified type : " + javaType.getName() );
ensureNoIdClass();
if ( id == null ) {
throw new IllegalArgumentException( "The id attribute is not declared on this type [" + getTypeName() + "]" );
}
checkType( id, javaType );
return (SingularAttribute<X, Y>) id;
}
/**
* Centralized check to ensure the id is actually declared on the class mapped here, as opposed to a
* super class.
*/
protected void checkDeclaredId() {
if ( id == null ) {
throw new IllegalArgumentException( "The id attribute is not declared on this type" );
}
}
@Override
@SuppressWarnings("unchecked")
public Type<?> getIdType() {
final SingularAttributeImpl id = locateIdAttribute();
if ( id != null ) {
checkSimpleId();
return id.getType();
}
else {
return requireSupertype().getIdType();
Set<SingularAttribute<? super X, ?>> idClassAttributes = getIdClassAttributesSafely();
if ( idClassAttributes != null ) {
if ( idClassAttributes.size() == 1 ) {
return idClassAttributes.iterator().next().getType();
}
}
return null;
}
private boolean hasIdClassAttributesDefined() {
return idClassAttributes != null ||
( getSupertype() != null && getSupertype().hasIdClassAttributesDefined() );
/**
* A form of {@link #getIdClassAttributes} which prefers to return {@code null} rather than throw exceptions
*
* @return IdClass attributes or {@code null}
*/
public Set<SingularAttribute<? super X, ?>> getIdClassAttributesSafely() {
if ( !hasIdClass() ) {
return null;
}
final Set<SingularAttribute<? super X, ?>> attributes = new HashSet<SingularAttribute<? super X, ?>>();
internalCollectIdClassAttributes( attributes );
if ( attributes.isEmpty() ) {
return null;
}
return attributes;
}
@Override
public Set<SingularAttribute<? super X, ?>> getIdClassAttributes() {
if ( idClassAttributes != null ) {
checkIdClass();
if ( !hasIdClass() ) {
throw new IllegalArgumentException( "This class [" + getJavaType() + "] does not define an IdClass" );
}
else {
// Java does not allow casting requireSupertype().getIdClassAttributes()
// to Set<SingularAttribute<? super X, ?>> because the
// superclass X is a different Java type from this X
// (i.e, getSupertype().getJavaType() != getJavaType()).
// It will, however, allow a Set<SingularAttribute<? super X, ?>>
// to be initialized with requireSupertype().getIdClassAttributes(),
// since getSupertype().getJavaType() is a superclass of getJavaType()
if ( requiresSupertypeForNonDeclaredIdentifier() ) {
idClassAttributes = new HashSet<SingularAttribute<? super X, ?>>( requireSupertype().getIdClassAttributes() );
}
else if ( getSupertype() != null && hasIdClassAttributesDefined() ) {
idClassAttributes = new HashSet<SingularAttribute<? super X, ?>>( getSupertype().getIdClassAttributes() );
}
final Set<SingularAttribute<? super X, ?>> attributes = new HashSet<SingularAttribute<? super X, ?>>();
internalCollectIdClassAttributes( attributes );
if ( attributes.isEmpty() ) {
throw new IllegalArgumentException( "Unable to locate IdClass attributes [" + getJavaType() + "]" );
}
return idClassAttributes;
return attributes;
}
/**
* Centralized check to ensure the id for this hierarchy uses an id-class.
*
* @see #checkSimpleId()
*/
private void checkIdClass() {
if ( hasIdentifierProperty ) {
throw new IllegalArgumentException( "This class does not use @IdClass" );
@SuppressWarnings("unchecked")
private void internalCollectIdClassAttributes(Set attributes) {
if ( idClassAttributes != null ) {
attributes.addAll( idClassAttributes );
}
else if ( getSupertype() != null ) {
getSupertype().internalCollectIdClassAttributes( attributes );
}
}
@ -215,32 +232,64 @@ public abstract class AbstractIdentifiableType<X>
@Override
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y> javaType) {
// todo : is return null allowed?
if ( ! hasVersionAttribute() ) {
return null;
}
final SingularAttribute<? super X, Y> version_;
SingularAttributeImpl version = locateVersionAttribute();
if ( version != null ) {
version_ = ( SingularAttribute<? super X, Y> ) version;
if ( javaType != version.getJavaType() ) {
throw new IllegalArgumentException( "Version attribute was not of specified type : " + javaType.getName() );
}
checkType( version, javaType );
}
return ( SingularAttribute<? super X, Y> ) version;
}
private SingularAttributeImpl locateVersionAttribute() {
if ( version != null ) {
return version;
}
else {
version_ = requireSupertype().getVersion( javaType );
if ( getSupertype() != null ) {
SingularAttributeImpl version = getSupertype().internalGetVersion();
if ( version != null ) {
return version;
}
}
}
return version_;
return null;
}
protected SingularAttributeImpl internalGetVersion() {
if ( version != null ) {
return version;
}
else {
if ( getSupertype() != null ) {
return getSupertype().internalGetVersion();
}
}
return null;
}
@Override
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y> javaType) {
checkDeclaredVersion();
if ( javaType != version.getJavaType() ) {
throw new IllegalArgumentException( "Version attribute was not of specified type : " + javaType.getName() );
}
checkType( version, javaType );
return ( SingularAttribute<X, Y> ) version;
}
private void checkDeclaredVersion() {
if ( version == null || ( getSupertype() != null && getSupertype().hasVersionAttribute() )) {
throw new IllegalArgumentException(
"The version attribute is not declared by this type [" + getJavaType() + "]"
);
}
}
/**
* For used to retrieve the declared version when populating the static metamodel.
*
@ -251,16 +300,6 @@ public abstract class AbstractIdentifiableType<X>
return version;
}
/**
* Centralized check to ensure the version (if one) is actually declared on the class mapped here, as opposed to a
* super class.
*/
protected void checkDeclaredVersion() {
if ( version == null || ( getSupertype() != null && getSupertype().hasVersionAttribute() )) {
throw new IllegalArgumentException( "The version attribute is not declared on this type" );
}
}
@Override
public Builder<X> getBuilder() {
final AbstractManagedType.Builder<X> managedBuilder = super.getBuilder();

View File

@ -58,8 +58,8 @@ public abstract class AbstractManagedType<X>
private final Map<String, PluralAttribute<X, ?, ?>> declaredPluralAttributes
= new HashMap<String, PluralAttribute<X,?,?>>();
protected AbstractManagedType(Class<X> javaType, AbstractManagedType<? super X> superType) {
super( javaType );
protected AbstractManagedType(Class<X> javaType, String typeName, AbstractManagedType<? super X> superType) {
super( javaType, typeName );
this.superType = superType;
}
@ -131,7 +131,7 @@ public abstract class AbstractManagedType<X>
@Override
public Attribute<X, ?> getDeclaredAttribute(String name) {
final Attribute<X, ?> attr = declaredSingularAttributes.get( name );
final Attribute<X, ?> attr = declaredAttributes.get( name );
checkNotNull( "Attribute ", attr, name );
return attr;
}

View File

@ -36,15 +36,6 @@ public abstract class AbstractType<X> implements Type<X>, Serializable {
private final Class<X> javaType;
private final String typeName;
/**
* Instantiates the type based on the given Java type.
*
* @param javaType The Java type of the JPA model type.
*/
protected AbstractType(Class<X> javaType) {
this( javaType, javaType != null ? javaType.getName() : null );
}
/**
* Instantiates the type based on the given Java type.
*

View File

@ -37,7 +37,7 @@ public class EmbeddableTypeImpl<X>
private final ComponentType hibernateType;
public EmbeddableTypeImpl(Class<X> javaType, AbstractManagedType parent, ComponentType hibernateType) {
super( javaType, null );
super( javaType, null, null );
this.parent = parent;
this.hibernateType = hibernateType;
}

View File

@ -33,21 +33,23 @@ import javax.persistence.metamodel.EntityType;
* @author Emmanuel Bernard
*/
public class EntityTypeImpl<X> extends AbstractIdentifiableType<X> implements EntityType<X>, Serializable {
private final String entityName;
private final String jpaEntityName;
public EntityTypeImpl(
Class<X> javaType,
AbstractIdentifiableType<? super X> superType,
String entityName,
String jpaEntityName,
boolean hasIdClass,
boolean hasIdentifierProperty,
boolean isVersioned) {
super( javaType, superType, hasIdentifierProperty, isVersioned );
this.entityName = entityName;
super( javaType, entityName, superType, hasIdClass, hasIdentifierProperty, isVersioned );
this.jpaEntityName = jpaEntityName;
}
@Override
public String getName() {
return entityName;
return jpaEntityName;
}
@Override
@ -64,9 +66,4 @@ public class EntityTypeImpl<X> extends AbstractIdentifiableType<X> implements En
public PersistenceType getPersistenceType() {
return PersistenceType.ENTITY;
}
@Override
protected boolean requiresSupertypeForNonDeclaredIdentifier() {
return true;
}
}

View File

@ -33,17 +33,14 @@ public class MappedSuperclassTypeImpl<X> extends AbstractIdentifiableType<X> imp
public MappedSuperclassTypeImpl(
Class<X> javaType,
AbstractIdentifiableType<? super X> superType,
boolean hasIdClass,
boolean hasIdentifierProperty,
boolean versioned) {
super( javaType, superType, hasIdentifierProperty, versioned );
}
public PersistenceType getPersistenceType() {
return PersistenceType.MAPPED_SUPERCLASS;
super( javaType, javaType.getName(), superType, hasIdClass, hasIdentifierProperty, versioned );
}
@Override
protected boolean requiresSupertypeForNonDeclaredIdentifier() {
return false;
public PersistenceType getPersistenceType() {
return PersistenceType.MAPPED_SUPERCLASS;
}
}

View File

@ -407,20 +407,17 @@ public class AttributeBuilder {
}
}
private EntityMetamodel getDeclarerEntityMetamodel(IdentifiableType<?> ownerType) {
private EntityMetamodel getDeclarerEntityMetamodel(AbstractIdentifiableType<?> ownerType) {
final Type.PersistenceType persistenceType = ownerType.getPersistenceType();
if ( persistenceType == Type.PersistenceType.ENTITY) {
String entityName;
if ( ownerType instanceof EntityType<?> ) {
entityName = ( ( EntityType<?> ) ownerType ).getName();
} else {
entityName = ownerType.getJavaType().getName();
}
return context.getSessionFactory()
.getEntityPersister( entityName ).getEntityMetamodel();
.getEntityPersister( ownerType.getTypeName() )
.getEntityMetamodel();
}
else if ( persistenceType == Type.PersistenceType.MAPPED_SUPERCLASS) {
return context.getSubClassEntityPersister( (MappedSuperclassTypeImpl) ownerType ).getEntityMetamodel();
return context.getSubClassEntityPersister( (MappedSuperclassTypeImpl<?>) ownerType )
.getEntityMetamodel();
}
else {
throw new AssertionFailure( "Cannot get the metamodel for PersistenceType: " + persistenceType );
@ -616,7 +613,7 @@ public class AttributeBuilder {
private final MemberResolver VIRTUAL_IDENTIFIER_MEMBER_RESOLVER = new MemberResolver() {
@Override
public Member resolveMember(AbstractManagedType owner, AttributeBinding attributeBinding) {
final IdentifiableType identifiableType = (IdentifiableType) owner;
final AbstractIdentifiableType identifiableType = (AbstractIdentifiableType) owner;
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( identifiableType );
if ( ! entityMetamodel.getIdentifierProperty().isVirtual() ) {
throw new IllegalArgumentException( "expecting a virtual (non-aggregated composite) identifier mapping" );
@ -653,7 +650,7 @@ public class AttributeBuilder {
}
else if ( Type.PersistenceType.ENTITY == persistenceType
|| Type.PersistenceType.MAPPED_SUPERCLASS == persistenceType ) {
final IdentifiableType identifiableType = (IdentifiableType) owner;
final AbstractIdentifiableType identifiableType = (AbstractIdentifiableType) owner;
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( identifiableType );
final String propertyName = attributeBinding.getAttribute().getName();
final Integer index = entityMetamodel.getPropertyIndexOrNull( propertyName );
@ -676,7 +673,7 @@ public class AttributeBuilder {
private final MemberResolver IDENTIFIER_MEMBER_RESOLVER = new MemberResolver() {
@Override
public Member resolveMember(AbstractManagedType owner, AttributeBinding attributeBinding) {
final IdentifiableType identifiableType = (IdentifiableType) owner;
final AbstractIdentifiableType identifiableType = (AbstractIdentifiableType) owner;
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( identifiableType );
final String attributeName = attributeBinding.getAttribute().getName();
if ( ! attributeName.equals( entityMetamodel.getIdentifierProperty().getName() ) ) {
@ -690,7 +687,7 @@ public class AttributeBuilder {
private final MemberResolver VERSION_MEMBER_RESOLVER = new MemberResolver() {
@Override
public Member resolveMember(AbstractManagedType owner, AttributeBinding attributeBinding) {
final IdentifiableType identifiableType = (IdentifiableType) owner;
final AbstractIdentifiableType identifiableType = (AbstractIdentifiableType) owner;
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( identifiableType );
final String versionPropertyName = attributeBinding.getAttribute().getName();
if ( ! versionPropertyName.equals( entityMetamodel.getVersionProperty().getName() ) ) {

View File

@ -106,7 +106,6 @@ public class MetamodelBuilder {
public MetamodelBuilder(SessionFactoryImplementor sessionFactory, JpaMetaModelPopulationSetting populationSetting) {
this.sessionFactory = sessionFactory;
this.populationSetting = populationSetting;
final AttributeBuilderContext attributeBuilderContext = new AttributeBuilderContext();
this.attributeBuilder = new AttributeBuilder( new AttributeBuilderContext() );
}
@ -134,6 +133,9 @@ public class MetamodelBuilder {
javaType,
superType,
entityBinding.getEntityName(),
entityBinding.getJpaEntityName(),
entityBinding.getHierarchyDetails().getEntityIdentifier().isNonAggregatedComposite()
&& entityBinding.getHierarchyDetails().getEntityIdentifier().getIdClassClass() != null,
entityBinding.getHierarchyDetails().getEntityIdentifier().getAttributeBinding() != null,
entityBinding.isVersioned()
);
@ -200,6 +202,8 @@ public class MetamodelBuilder {
MappedSuperclassTypeImpl mappedSuperclassType = new MappedSuperclassTypeImpl(
javaType,
superSuperType,
entityBinding.getHierarchyDetails().getEntityIdentifier().isNonAggregatedComposite()
&& entityBinding.getHierarchyDetails().getEntityIdentifier().getIdClassClass() != null,
entityBinding.getHierarchyDetails().getEntityIdentifier().getAttributeBinding() != null,
entityBinding.isVersioned()
);
@ -222,7 +226,6 @@ public class MetamodelBuilder {
populateStaticMetamodel( embeddable );
}
return new MetamodelImpl(
entityTypeMap,
mappedSuperclassTypeMap,

View File

@ -12,6 +12,7 @@ import org.hibernate.jpa.test.Cat;
import org.hibernate.jpa.test.Kitten;
import org.hibernate.testing.FailureExpected;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@ -131,7 +132,9 @@ public class CallbacksTest extends BaseEntityManagerFunctionalTestCase {
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8931" )
public void testCallBackListenersHierarchy() throws Exception {
// used both to
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();
Television tv = new Television();

View File

@ -34,6 +34,7 @@ import org.junit.Test;
import org.hibernate.TransientPropertyValueException;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.testing.FailureExpected;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@ -175,7 +176,11 @@ public class MultiCircleJpaCascadeTest extends BaseEntityManagerFunctionalTestCa
}
@Test
@FailureExpectedWithNewMetamodel
public void testPersist() {
// no idea why this fails with new metamodel
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();
em.persist( b );
@ -186,7 +191,11 @@ public class MultiCircleJpaCascadeTest extends BaseEntityManagerFunctionalTestCa
}
@Test
@FailureExpectedWithNewMetamodel
public void testPersistNoCascadeToTransient() {
// no idea why this fails with new metamodel
skipCleanup = true;
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();

View File

@ -45,7 +45,9 @@ import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
@ -57,7 +59,7 @@ import static org.junit.Assert.assertEquals;
* @author Steve Ebersole
*/
@TestForIssue( jiraKey = "HHH-8842" )
public class BasicJodaTimeConversionTest {
public class BasicJodaTimeConversionTest extends BaseUnitTestCase {
static int callsToConverter = 0;
public static class JodaLocalDateConverter implements AttributeConverter<LocalDate, Date> {
@ -89,6 +91,7 @@ public class BasicJodaTimeConversionTest {
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertUsage() throws MalformedURLException {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -48,6 +48,7 @@ import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -59,6 +60,7 @@ import static org.junit.Assert.assertEquals;
@TestForIssue( jiraKey = "HHH-8529" )
public class CollectionCompositeElementConversionTest extends BaseUnitTestCase {
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testElementCollectionConversion() {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -49,6 +49,7 @@ import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -60,6 +61,7 @@ import static org.junit.Assert.assertEquals;
@TestForIssue( jiraKey = "HHH-8529" )
public class CollectionElementConversionTest extends BaseUnitTestCase {
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testElementCollectionConversion() {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -44,7 +44,9 @@ import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
@ -54,7 +56,7 @@ import static org.junit.Assert.assertEquals;
* @author Steve Ebersole
*/
@TestForIssue( jiraKey = "HHH-8807" )
public class ExplicitDateConvertersTest {
public class ExplicitDateConvertersTest extends BaseUnitTestCase {
// NOTE : initially unable to reproduce the reported problem
@ -93,6 +95,7 @@ public class ExplicitDateConvertersTest {
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertUsage() throws MalformedURLException {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -44,7 +44,9 @@ import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
@ -54,7 +56,7 @@ import static org.junit.Assert.assertEquals;
* @author Steve Ebersole
*/
@TestForIssue( jiraKey = "HHH-8809" )
public class ExplicitEnumConvertersTest {
public class ExplicitEnumConvertersTest extends BaseUnitTestCase {
// NOTE : initially unable to reproduce the reported problem
@ -101,6 +103,7 @@ public class ExplicitEnumConvertersTest {
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertUsage() throws MalformedURLException {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -47,6 +47,7 @@ import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -58,6 +59,7 @@ import static org.junit.Assert.assertEquals;
@TestForIssue( jiraKey = "HHH-8529" )
public class MapElementConversionTest extends BaseUnitTestCase {
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testElementCollectionConversion() {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -45,6 +45,7 @@ import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -56,6 +57,7 @@ import static org.junit.Assert.assertEquals;
@TestForIssue( jiraKey = "HHH-8529" )
public class MapKeyConversionTest extends BaseUnitTestCase {
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testElementCollectionConversion() {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -34,6 +34,7 @@ import javax.persistence.Table;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@ -50,6 +51,7 @@ public class QueryTest extends BaseEntityManagerFunctionalTestCase {
public static final float SALARY = 267.89f;
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testJpqlLiteral() {
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();

View File

@ -48,6 +48,7 @@ import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
@ -61,6 +62,7 @@ public class SimpleConvertAnnotationTest extends BaseUnitTestCase {
// test handling of an AttributeConverter explicitly named via a @Convert annotation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertUsage() throws MalformedURLException {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -48,6 +48,7 @@ import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
@ -61,6 +62,7 @@ public class SimpleConvertsAnnotationTest extends BaseUnitTestCase {
// test handling of an AttributeConverter explicitly named via a @Convert annotation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertUsage() throws MalformedURLException {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -46,6 +46,7 @@ import org.hibernate.type.Type;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
@ -60,6 +61,7 @@ public class SimpleEmbeddableOverriddenConverterTest extends BaseUnitTestCase {
* Test outcome of annotations exclusively.
*/
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertOverrides() {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -41,6 +41,7 @@ import org.hibernate.type.StringType;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
@ -56,6 +57,7 @@ public class SimpleXmlOverriddenTest extends BaseUnitTestCase {
* A baseline test, with an explicit @Convert annotation that should be in effect
*/
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void baseline() {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -46,7 +46,9 @@ import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
@ -59,7 +61,7 @@ import static org.junit.Assert.assertEquals;
* @author Steve Ebersole
*/
@TestForIssue( jiraKey = "HHH-8812" )
public class XmlWithExplicitConvertAnnotationsTest {
public class XmlWithExplicitConvertAnnotationsTest extends BaseUnitTestCase {
// NOTE : essentially the same exact test as ExplicitDateConvertersTest, but here we will mix annotations and xml
@ -106,6 +108,7 @@ public class XmlWithExplicitConvertAnnotationsTest {
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8932" )
public void testSimpleConvertUsage() throws MalformedURLException {
final PersistenceUnitDescriptorAdapter pu = new PersistenceUnitDescriptorAdapter() {
@Override

View File

@ -43,7 +43,7 @@ import org.hibernate.testing.TestForIssue;
public class ComponentCriteriaTest extends BaseEntityManagerFunctionalTestCase {
@Override
public Class[] getAnnotatedClasses() {
return new Class[] { Client.class };
return new Class[] { Client.class, Name.class };
}
@Test

View File

@ -137,21 +137,4 @@ public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
assertEquals( ValidationMode.NONE, builder.getConfigurationValues().get( AvailableSettings.VALIDATION_MODE ) );
}
}
@Test
public void testContainerBootstrapValidationFactory() {
final Object token = new Object();
PersistenceUnitInfoAdapter adapter = new PersistenceUnitInfoAdapter();
try {
Bootstrap.getEntityManagerFactoryBuilder(
adapter,
Collections.singletonMap( AvailableSettings.VALIDATION_FACTORY, token )
);
fail( "Was expecting error as token did not implement ValidatorFactory" );
}
catch ( HibernateException e ) {
// probably the condition we want but unfortunately the exception is not specific
// and the pertinent info is in a cause
}
}
}

View File

@ -118,14 +118,13 @@ public class PersisterClassProviderTest {
}
public static class GoofyProvider implements EntityPersister {
@SuppressWarnings( {"UnusedParameters"})
@SuppressWarnings({"UnusedParameters", "UnusedDeclaration"})
public GoofyProvider(
org.hibernate.mapping.PersistentClass persistentClass,
org.hibernate.cache.spi.access.EntityRegionAccessStrategy strategy,
NaturalIdRegionAccessStrategy naturalIdRegionAccessStrategy,
SessionFactoryImplementor sf,
Mapping mapping) {
org.hibernate.metamodel.spi.binding.EntityBinding entityBinding,
org.hibernate.cache.spi.access.EntityRegionAccessStrategy entityRegionAccessStrategy,
org.hibernate.cache.spi.access.NaturalIdRegionAccessStrategy naturalIdRegionAccessStrategy,
org.hibernate.engine.spi.SessionFactoryImplementor sf,
org.hibernate.engine.spi.Mapping mapping) {
throw new GoofyException();
}

View File

@ -57,13 +57,16 @@ import org.hibernate.loader.plan.spi.LoadPlan;
import org.hibernate.loader.plan.spi.QuerySpace;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
/**
* @author Strong Liu <stliu@hibernate.org>
*/
@FailureExpectedWithNewMetamodel( message = "Caused by: java.lang.IllegalArgumentException: resolvedHibernateType must be non-null." )
public class EntityGraphLoadPlanBuilderTest extends BaseEntityManagerFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { Cat.class, Person.class, Country.class, Dog.class, ExpressCompany.class };
return new Class[] { Cat.class, Person.class, Country.class, Dog.class, ExpressCompany.class, Address.class };
}
@Entity

View File

@ -27,6 +27,7 @@ import javax.persistence.EntityGraph;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.junit.Test;
import static junit.framework.Assert.assertNotNull;
@ -36,6 +37,7 @@ import static junit.framework.Assert.assertNotNull;
*/
public abstract class AbstractNamedEntityGraphTest extends BaseEntityManagerFunctionalTestCase {
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8933" )
public void testIt() {
EntityGraph graph = getOrCreateEntityManager().getEntityGraph( "Person" );
assertNotNull( graph );

View File

@ -33,6 +33,8 @@ import org.junit.Test;
import java.util.List;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@ -46,6 +48,7 @@ public class NamedEntityGraphsTest extends BaseEntityManagerFunctionalTestCase
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8933" )
public void testIt() {
EntityGraph graph = getOrCreateEntityManager().getEntityGraph( "abc" );
assertNotNull( graph );
@ -54,6 +57,7 @@ public class NamedEntityGraphsTest extends BaseEntityManagerFunctionalTestCase
}
@Test
@FailureExpectedWithNewMetamodel( jiraKey = "HHH-8933" )
public void testAttributeNodesAreAvailable() {
EntityManager em = getOrCreateEntityManager();
EntityGraph graph = em.getEntityGraph( "name_salary_graph" );

View File

@ -111,13 +111,13 @@ public class OrmVersionTest {
return mappingFileNames;
}
private final List<String> managedClassNames = new ArrayList<String>();
private PersistenceUnitInfoImpl addMappingFileName(String mappingFileName) {
mappingFileNames.add( mappingFileName );
return this;
}
private final List<String> managedClassNames = new ArrayList<String>();
public List<String> getManagedClassNames() {
return managedClassNames;
}

View File

@ -46,6 +46,7 @@ import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.metamodel.Metadata;
import org.hibernate.metamodel.MetadataSources;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@ -59,6 +60,7 @@ import static org.junit.Assert.fail;
/**
* @author Emmanuel Bernard
*/
@FailureExpectedWithNewMetamodel( jiraKey="HHH-8935" )
public class MetadataTest extends BaseEntityManagerFunctionalTestCase {
@Test
public void testBaseOfService() throws Exception {

View File

@ -34,6 +34,8 @@ import org.junit.Test;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@ -42,6 +44,7 @@ import static org.junit.Assert.assertTrue;
/**
* @author Steve Ebersole
*/
@FailureExpectedWithNewMetamodel( jiraKey="HHH-8935" )
public class StaticMetadataTest extends BaseEntityManagerFunctionalTestCase {
@Test
public void testInjections() throws Exception {

View File

@ -27,12 +27,11 @@ import javax.persistence.EntityManagerFactory;
import java.util.Arrays;
import org.hibernate.jpa.test.TestingEntityManagerFactoryGenerator;
import org.hibernate.jpa.test.metagen.mappedsuperclass.attribute.AbstractNameable_;
import org.hibernate.jpa.test.metagen.mappedsuperclass.attribute.Product_;
import org.hibernate.jpa.AvailableSettings;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -44,7 +43,12 @@ import static org.junit.Assert.assertNotNull;
@TestForIssue( jiraKey = "HHH-5024" )
public class MappedSuperclassWithAttributesTest extends BaseUnitTestCase {
@Test
@FailureExpectedWithNewMetamodel
public void testStaticMetamodel() {
// spent too much time digging into this. problem is ultimately that metamodel binding
// is not handling MappedSuperclass well
EntityManagerFactory emf = TestingEntityManagerFactoryGenerator.generateEntityManagerFactory(
AvailableSettings.LOADED_CLASSES,
Arrays.asList( Product.class )

View File

@ -31,6 +31,7 @@ import org.hibernate.jpa.AvailableSettings;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -42,10 +43,15 @@ import static org.junit.Assert.assertNotNull;
public class MappedSuperclassWithEmbeddedTest extends BaseUnitTestCase {
@Test
@TestForIssue( jiraKey = "HHH-5024" )
@FailureExpectedWithNewMetamodel
public void testStaticMetamodel() {
// spent too much time digging into this. problem is ultimately that metamodel binding
// is not handling MappedSuperclass well
EntityManagerFactory emf = TestingEntityManagerFactoryGenerator.generateEntityManagerFactory(
AvailableSettings.LOADED_CLASSES,
Arrays.asList( Company.class )
Arrays.asList( Company.class, Address.class )
);
assertNotNull( "'Company_.id' should not be null)", Company_.id );

View File

@ -31,6 +31,7 @@ import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.junit.Test;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import static org.junit.Assert.assertNotNull;
@ -39,7 +40,12 @@ import static org.junit.Assert.fail;
/**
* @author Steve Ebersole
*/
@FailureExpectedWithNewMetamodel
public class MappedSuperclassTypeTest extends BaseEntityManagerFunctionalTestCase {
// spent too much time digging into this. problem is ultimately that metamodel binding
// is not handling MappedSuperclass well
@Override
public Class[] getAnnotatedClasses() {
return new Class[] { SomeMappedSuperclassSubclass.class };

View File

@ -1,8 +1,11 @@
package org.hibernate.jpa.test.procedure;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
/**
* @author Strong Liu <stliu@hibernate.org>
*/
@FailureExpectedWithNewMetamodel
public class AnnotationTest extends AbstractStoredProcedureTest {
@Override
protected Class<?>[] getAnnotatedClasses() {

View File

@ -1,8 +1,11 @@
package org.hibernate.jpa.test.procedure;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
/**
* @author Strong Liu <stliu@hibernate.org>
*/
@FailureExpectedWithNewMetamodel
public class OrmTest extends AbstractStoredProcedureTest{
@Override
public String[] getEjb3DD() {

View File

@ -118,6 +118,7 @@ public class GetIdentifierTest extends BaseEntityManagerFunctionalTestCase {
return new Class[] {
Book.class,
Umbrella.class,
Umbrella.PK.class,
Sickness.class,
Author.class,
Article.class

View File

@ -1,6 +1,7 @@
package org.hibernate.jpa.test.util;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@ -31,6 +32,7 @@ public class Umbrella {
this.size = size;
}
@Embeddable
public static class PK implements Serializable {
private String model;
private String brand;

View File

@ -35,10 +35,17 @@ import org.hibernate.jpa.AvailableSettings;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
/**
* @author Emmanuel Bernard
*/
@FailureExpectedWithNewMetamodel
public class XmlTest extends BaseEntityManagerFunctionalTestCase {
// failures from org.hibernate.tuple.PropertyFactory.buildEntityBasedAttribute again
// where attribute is an association (ManyToOne), Type resolves to null
@Test
public void testXmlMappingCorrectness() throws Exception {
EntityManager em = getOrCreateEntityManager();

View File

@ -52,4 +52,5 @@
</entity-listener>
</entity-listeners>
</entity>
<embeddable class="Version1"/>
</entity-mappings>

View File

@ -54,4 +54,6 @@
</entity-listener>
</entity-listeners>
</entity>
<embeddable class="Version">
</embeddable>
</entity-mappings>