use of org.hibernate.MappingException in project hibernate-orm by hibernate.
the class ResultsetMappingSecondPass method getSubPropertyIterator.
private Iterator getSubPropertyIterator(PersistentClass pc, String reducedName) {
Value value = pc.getRecursiveProperty(reducedName).getValue();
Iterator parentPropIter;
if (value instanceof Component) {
Component comp = (Component) value;
parentPropIter = comp.getPropertyIterator();
} else if (value instanceof ToOne) {
ToOne toOne = (ToOne) value;
PersistentClass referencedPc = context.getMetadataCollector().getEntityBinding(toOne.getReferencedEntityName());
if (toOne.getReferencedPropertyName() != null) {
try {
parentPropIter = ((Component) referencedPc.getRecursiveProperty(toOne.getReferencedPropertyName()).getValue()).getPropertyIterator();
} catch (ClassCastException e) {
throw new MappingException("dotted notation reference neither a component nor a many/one to one", e);
}
} else {
try {
if (referencedPc.getIdentifierMapper() == null) {
parentPropIter = ((Component) referencedPc.getIdentifierProperty().getValue()).getPropertyIterator();
} else {
parentPropIter = referencedPc.getIdentifierMapper().getPropertyIterator();
}
} catch (ClassCastException e) {
throw new MappingException("dotted notation reference neither a component nor a many/one to one", e);
}
}
} else {
throw new MappingException("dotted notation reference neither a component nor a many/one to one");
}
return parentPropIter;
}
use of org.hibernate.MappingException in project hibernate-orm by hibernate.
the class ResultsetMappingSecondPass method doSecondPass.
@Override
public void doSecondPass(Map persistentClasses) throws MappingException {
//TODO add parameters checkings
if (ann == null)
return;
ResultSetMappingDefinition definition = new ResultSetMappingDefinition(ann.name());
LOG.debugf("Binding result set mapping: %s", definition.getName());
int entityAliasIndex = 0;
for (EntityResult entity : ann.entities()) {
//TODO parameterize lock mode?
List<FieldResult> properties = new ArrayList<FieldResult>();
List<String> propertyNames = new ArrayList<String>();
for (FieldResult field : entity.fields()) {
//use an ArrayList cause we might have several columns per root property
String name = field.name();
if (name.indexOf('.') == -1) {
//regular property
properties.add(field);
propertyNames.add(name);
} else {
/**
* Reorder properties
* 1. get the parent property
* 2. list all the properties following the expected one in the parent property
* 3. calculate the lowest index and insert the property
*/
PersistentClass pc = context.getMetadataCollector().getEntityBinding(entity.entityClass().getName());
if (pc == null) {
throw new MappingException(String.format(Locale.ENGLISH, "Could not resolve entity [%s] referenced in SqlResultSetMapping [%s]", entity.entityClass().getName(), ann.name()));
}
int dotIndex = name.lastIndexOf('.');
String reducedName = name.substring(0, dotIndex);
Iterator parentPropItr = getSubPropertyIterator(pc, reducedName);
List<String> followers = getFollowers(parentPropItr, reducedName, name);
int index = propertyNames.size();
for (String follower : followers) {
int currentIndex = getIndexOfFirstMatchingProperty(propertyNames, follower);
index = currentIndex != -1 && currentIndex < index ? currentIndex : index;
}
propertyNames.add(index, name);
properties.add(index, field);
}
}
Set<String> uniqueReturnProperty = new HashSet<String>();
Map<String, ArrayList<String>> propertyResultsTmp = new HashMap<String, ArrayList<String>>();
for (Object property : properties) {
final FieldResult propertyresult = (FieldResult) property;
final String name = propertyresult.name();
if ("class".equals(name)) {
throw new MappingException("class is not a valid property name to use in a @FieldResult, use @Entity(discriminatorColumn) instead");
}
if (uniqueReturnProperty.contains(name)) {
throw new MappingException("duplicate @FieldResult for property " + name + " on @Entity " + entity.entityClass().getName() + " in " + ann.name());
}
uniqueReturnProperty.add(name);
final String quotingNormalizedColumnName = normalizeColumnQuoting(propertyresult.column());
String key = StringHelper.root(name);
ArrayList<String> intermediateResults = propertyResultsTmp.get(key);
if (intermediateResults == null) {
intermediateResults = new ArrayList<String>();
propertyResultsTmp.put(key, intermediateResults);
}
intermediateResults.add(quotingNormalizedColumnName);
}
Map<String, String[]> propertyResults = new HashMap<String, String[]>();
for (Map.Entry<String, ArrayList<String>> entry : propertyResultsTmp.entrySet()) {
propertyResults.put(entry.getKey(), entry.getValue().toArray(new String[entry.getValue().size()]));
}
if (!BinderHelper.isEmptyAnnotationValue(entity.discriminatorColumn())) {
final String quotingNormalizedName = normalizeColumnQuoting(entity.discriminatorColumn());
propertyResults.put("class", new String[] { quotingNormalizedName });
}
if (propertyResults.isEmpty()) {
propertyResults = java.util.Collections.emptyMap();
}
NativeSQLQueryRootReturn result = new NativeSQLQueryRootReturn("alias" + entityAliasIndex++, entity.entityClass().getName(), propertyResults, LockMode.READ);
definition.addQueryReturn(result);
}
for (ColumnResult column : ann.columns()) {
definition.addQueryReturn(new NativeSQLQueryScalarReturn(normalizeColumnQuoting(column.name()), column.type() != null ? context.getMetadataCollector().getTypeResolver().heuristicType(column.type().getName()) : null));
}
for (ConstructorResult constructorResult : ann.classes()) {
List<NativeSQLQueryScalarReturn> columnReturns = new ArrayList<NativeSQLQueryScalarReturn>();
for (ColumnResult columnResult : constructorResult.columns()) {
columnReturns.add(new NativeSQLQueryScalarReturn(normalizeColumnQuoting(columnResult.name()), columnResult.type() != null ? context.getMetadataCollector().getTypeResolver().heuristicType(columnResult.type().getName()) : null));
}
definition.addQueryReturn(new NativeSQLQueryConstructorReturn(constructorResult.targetClass(), columnReturns));
}
if (isDefault) {
context.getMetadataCollector().addDefaultResultSetMapping(definition);
} else {
context.getMetadataCollector().addResultSetMapping(definition);
}
}
use of org.hibernate.MappingException in project hibernate-orm by hibernate.
the class EntityBinder method getExplicitAccessType.
public AccessType getExplicitAccessType(XAnnotatedElement element) {
AccessType accessType = null;
AccessType hibernateAccessType = null;
AccessType jpaAccessType = null;
org.hibernate.annotations.AccessType accessTypeAnnotation = element.getAnnotation(org.hibernate.annotations.AccessType.class);
if (accessTypeAnnotation != null) {
hibernateAccessType = AccessType.getAccessStrategy(accessTypeAnnotation.value());
}
Access access = element.getAnnotation(Access.class);
if (access != null) {
jpaAccessType = AccessType.getAccessStrategy(access.value());
}
if (hibernateAccessType != null && jpaAccessType != null && hibernateAccessType != jpaAccessType) {
throw new MappingException("Found @Access and @AccessType with conflicting values on a property in class " + annotatedClass.toString());
}
if (hibernateAccessType != null) {
accessType = hibernateAccessType;
} else if (jpaAccessType != null) {
accessType = jpaAccessType;
}
return accessType;
}
use of org.hibernate.MappingException in project hibernate-orm by hibernate.
the class EntityBinder method bindEntity.
public void bindEntity() {
persistentClass.setAbstract(annotatedClass.isAbstract());
persistentClass.setClassName(annotatedClass.getName());
persistentClass.setJpaEntityName(name);
//persistentClass.setDynamic(false); //no longer needed with the Entity name refactoring?
persistentClass.setEntityName(annotatedClass.getName());
bindDiscriminatorValue();
persistentClass.setLazy(lazy);
if (proxyClass != null) {
persistentClass.setProxyInterfaceName(proxyClass.getName());
}
persistentClass.setDynamicInsert(dynamicInsert);
persistentClass.setDynamicUpdate(dynamicUpdate);
if (persistentClass instanceof RootClass) {
RootClass rootClass = (RootClass) persistentClass;
boolean mutable = true;
//priority on @Immutable, then @Entity.mutable()
if (annotatedClass.isAnnotationPresent(Immutable.class)) {
mutable = false;
} else {
org.hibernate.annotations.Entity entityAnn = annotatedClass.getAnnotation(org.hibernate.annotations.Entity.class);
if (entityAnn != null) {
mutable = entityAnn.mutable();
}
}
rootClass.setMutable(mutable);
rootClass.setExplicitPolymorphism(isExplicitPolymorphism(polymorphismType));
if (StringHelper.isNotEmpty(where))
rootClass.setWhere(where);
if (cacheConcurrentStrategy != null) {
rootClass.setCacheConcurrencyStrategy(cacheConcurrentStrategy);
rootClass.setCacheRegionName(cacheRegion);
rootClass.setLazyPropertiesCacheable(cacheLazyProperty);
}
rootClass.setNaturalIdCacheRegionName(naturalIdCacheRegion);
boolean forceDiscriminatorInSelects = forceDiscriminator == null ? context.getBuildingOptions().shouldImplicitlyForceDiscriminatorInSelect() : forceDiscriminator;
rootClass.setForceDiscriminator(forceDiscriminatorInSelects);
if (insertableDiscriminator != null) {
rootClass.setDiscriminatorInsertable(insertableDiscriminator);
}
} else {
if (explicitHibernateEntityAnnotation) {
LOG.entityAnnotationOnNonRoot(annotatedClass.getName());
}
if (annotatedClass.isAnnotationPresent(Immutable.class)) {
LOG.immutableAnnotationOnNonRoot(annotatedClass.getName());
}
if (annotatedClass.isAnnotationPresent(Cacheable.class) || annotatedClass.isAnnotationPresent(Cache.class)) {
LOG.cacheOrCacheableAnnotationOnNonRoot(annotatedClass.getName());
}
}
persistentClass.setOptimisticLockStyle(getVersioning(optimisticLockType));
persistentClass.setSelectBeforeUpdate(selectBeforeUpdate);
//set persister if needed
Persister persisterAnn = annotatedClass.getAnnotation(Persister.class);
Class persister = null;
if (persisterAnn != null) {
persister = persisterAnn.impl();
} else {
org.hibernate.annotations.Entity entityAnn = annotatedClass.getAnnotation(org.hibernate.annotations.Entity.class);
if (entityAnn != null && !BinderHelper.isEmptyAnnotationValue(entityAnn.persister())) {
try {
persister = context.getClassLoaderAccess().classForName(entityAnn.persister());
} catch (ClassLoadingException e) {
throw new AnnotationException("Could not find persister class: " + entityAnn.persister(), e);
}
}
}
if (persister != null) {
persistentClass.setEntityPersisterClass(persister);
}
persistentClass.setBatchSize(batchSize);
//SQL overriding
SQLInsert sqlInsert = annotatedClass.getAnnotation(SQLInsert.class);
SQLUpdate sqlUpdate = annotatedClass.getAnnotation(SQLUpdate.class);
SQLDelete sqlDelete = annotatedClass.getAnnotation(SQLDelete.class);
SQLDeleteAll sqlDeleteAll = annotatedClass.getAnnotation(SQLDeleteAll.class);
Loader loader = annotatedClass.getAnnotation(Loader.class);
if (sqlInsert != null) {
persistentClass.setCustomSQLInsert(sqlInsert.sql().trim(), sqlInsert.callable(), ExecuteUpdateResultCheckStyle.fromExternalName(sqlInsert.check().toString().toLowerCase(Locale.ROOT)));
}
if (sqlUpdate != null) {
persistentClass.setCustomSQLUpdate(sqlUpdate.sql(), sqlUpdate.callable(), ExecuteUpdateResultCheckStyle.fromExternalName(sqlUpdate.check().toString().toLowerCase(Locale.ROOT)));
}
if (sqlDelete != null) {
persistentClass.setCustomSQLDelete(sqlDelete.sql(), sqlDelete.callable(), ExecuteUpdateResultCheckStyle.fromExternalName(sqlDelete.check().toString().toLowerCase(Locale.ROOT)));
}
if (sqlDeleteAll != null) {
persistentClass.setCustomSQLDelete(sqlDeleteAll.sql(), sqlDeleteAll.callable(), ExecuteUpdateResultCheckStyle.fromExternalName(sqlDeleteAll.check().toString().toLowerCase(Locale.ROOT)));
}
if (loader != null) {
persistentClass.setLoaderName(loader.namedQuery());
}
final JdbcEnvironment jdbcEnvironment = context.getMetadataCollector().getDatabase().getJdbcEnvironment();
if (annotatedClass.isAnnotationPresent(Synchronize.class)) {
Synchronize synchronizedWith = annotatedClass.getAnnotation(Synchronize.class);
String[] tables = synchronizedWith.value();
for (String table : tables) {
persistentClass.addSynchronizedTable(context.getBuildingOptions().getPhysicalNamingStrategy().toPhysicalTableName(jdbcEnvironment.getIdentifierHelper().toIdentifier(table), jdbcEnvironment).render(jdbcEnvironment.getDialect()));
}
}
if (annotatedClass.isAnnotationPresent(Subselect.class)) {
Subselect subselect = annotatedClass.getAnnotation(Subselect.class);
this.subselect = subselect.value();
}
//tuplizers
if (annotatedClass.isAnnotationPresent(Tuplizers.class)) {
for (Tuplizer tuplizer : annotatedClass.getAnnotation(Tuplizers.class).value()) {
EntityMode mode = EntityMode.parse(tuplizer.entityMode());
//todo tuplizer.entityModeType
persistentClass.addTuplizer(mode, tuplizer.impl().getName());
}
}
if (annotatedClass.isAnnotationPresent(Tuplizer.class)) {
Tuplizer tuplizer = annotatedClass.getAnnotation(Tuplizer.class);
EntityMode mode = EntityMode.parse(tuplizer.entityMode());
//todo tuplizer.entityModeType
persistentClass.addTuplizer(mode, tuplizer.impl().getName());
}
for (Filter filter : filters) {
String filterName = filter.name();
String cond = filter.condition();
if (BinderHelper.isEmptyAnnotationValue(cond)) {
FilterDefinition definition = context.getMetadataCollector().getFilterDefinition(filterName);
cond = definition == null ? null : definition.getDefaultFilterCondition();
if (StringHelper.isEmpty(cond)) {
throw new AnnotationException("no filter condition found for filter " + filterName + " in " + this.name);
}
}
persistentClass.addFilter(filterName, cond, filter.deduceAliasInjectionPoints(), toAliasTableMap(filter.aliases()), toAliasEntityMap(filter.aliases()));
}
LOG.debugf("Import with entity name %s", name);
try {
context.getMetadataCollector().addImport(name, persistentClass.getEntityName());
String entityName = persistentClass.getEntityName();
if (!entityName.equals(name)) {
context.getMetadataCollector().addImport(entityName, entityName);
}
} catch (MappingException me) {
throw new AnnotationException("Use of the same entity name twice: " + name, me);
}
processNamedEntityGraphs();
}
use of org.hibernate.MappingException in project hibernate-orm by hibernate.
the class QueryHintDefinition method getFlushMode.
public FlushMode getFlushMode(String query) {
String hitName = QueryHints.FLUSH_MODE;
String value = (String) hintsMap.get(hitName);
if (value == null) {
return null;
}
try {
return FlushMode.interpretExternalSetting(value);
} catch (MappingException e) {
throw new AnnotationException("Unknown FlushMode in hint: " + query + ":" + hitName, e);
}
}
Aggregations