@Override public List<String> getIdentifierOrUniqueKeyEmbeddedPropertyNames(EntityType<?> owner, String attributeName) { // TODO: cache this via extended metamodel return jpaProvider.getIdentifierOrUniqueKeyEmbeddedPropertyNames(owner, attributeName); }
@Override public List<String> getIdentifierOrUniqueKeyEmbeddedPropertyNames(EntityType<?> owner, String elementCollectionPath, String attributeName) { // TODO: cache this via extended metamodel return jpaProvider.getIdentifierOrUniqueKeyEmbeddedPropertyNames(owner, elementCollectionPath, attributeName); }
public UnmappedWritableBasicAttributeSetNullCascadeDeleter(EntityViewManagerImpl evm, ExtendedManagedType<?> extendedManagedType, Map<String, String> writableMappings) { this.ownerEntityClass = extendedManagedType.getType().getJavaType(); Map<String, String> removeByIdMappings = new HashMap<>(writableMappings.size()); Map<String, String> removeByOwnerIdMappings = new HashMap<>(writableMappings.size()); for (Map.Entry<String, String> entry : writableMappings.entrySet()) { String ownerIdAttribute = extendedManagedType.getIdAttribute().getName(); List<String> idAttributes = evm.getJpaProvider().getIdentifierOrUniqueKeyEmbeddedPropertyNames((EntityType<?>) extendedManagedType.getType(), entry.getValue()); removeByIdMappings.put(entry.getValue(), ownerIdAttribute); // NOTE: We ignore the fact that there might be multiple id attributes here because we currently support id class attributes yet anyway if (!idAttributes.isEmpty()) { removeByOwnerIdMappings.put(entry.getValue(), entry.getValue() + "." + idAttributes.get(0)); } } this.removeByIdMappings = removeByIdMappings; this.removeByOwnerIdMappings = removeByOwnerIdMappings; }
private void collectIdColumns(EntityType<?> e, Map<String, AttributeEntry<?, ?>> attributeMap, String attributeName, List<Attribute<?, ?>> newParents, String elementCollectionPath, Class<?> fieldType, Map<String, TemporaryExtendedManagedType> temporaryExtendedManagedTypes, Set<Class<?>> seenTypesForEnumResolving, Map<String, Class<Enum<?>>> enumTypes) { List<String> identifierOrUniqueKeyEmbeddedPropertyNames; if (elementCollectionPath == null) { identifierOrUniqueKeyEmbeddedPropertyNames = jpaProvider.getIdentifierOrUniqueKeyEmbeddedPropertyNames(e, attributeName); } else { identifierOrUniqueKeyEmbeddedPropertyNames = jpaProvider.getIdentifierOrUniqueKeyEmbeddedPropertyNames(e, elementCollectionPath, attributeName); } EntityType<?> fieldEntityType = delegate.entity(fieldType); for (String name : identifierOrUniqueKeyEmbeddedPropertyNames) { Attribute<?, ?> idAttribute = JpaMetamodelUtils.getAttribute(fieldEntityType, name); Class<?> idType = JpaMetamodelUtils.resolveFieldClass(fieldType, idAttribute); String idPath = attributeName + "." + name; ArrayList<Attribute<?, ?>> idParents = new ArrayList<>(newParents.size() + 1); idParents.addAll(newParents); idParents.add(idAttribute); AttributeEntry attributeEntry = new AttributeEntry(jpaProvider, e, idAttribute, idPath, idType, idParents, elementCollectionPath); attributeMap.put(idPath, attributeEntry); if (isAssociation(idAttribute)) { collectIdColumns(e, attributeMap, idPath, newParents, elementCollectionPath, idType, temporaryExtendedManagedTypes, seenTypesForEnumResolving, enumTypes); } } }
List<String> attributeNames; if (elementCollectionPath == null) { attributeNames = jpaProvider.getIdentifierOrUniqueKeyEmbeddedPropertyNames(ownerType, fieldPrefix + attributeName); } else { attributeNames = jpaProvider.getIdentifierOrUniqueKeyEmbeddedPropertyNames(ownerType, elementCollectionPath, elementCollectionPath + "." + fieldPrefix + attributeName);
private String getNaturalIdAttribute(Expression expression) { // When comparing an alias with a natural key joined relation, we have to append the natural id to the paths // Hibernate fails to do this and instead compares the primary key with the natural key which might go by unnoticed if (expression instanceof PathExpression) { PathExpression pathExpression = (PathExpression) expression; visit(pathExpression, false); PathReference pathReference = (pathExpression).getPathReference(); // We only attach the natural id to paths referring to entity types if (pathReference != null && pathReference.getField() != null && pathReference.getType() instanceof EntityType<?>) { JoinNode node = (JoinNode) pathReference.getBaseNode(); // We need a parent tree node to determine the natural id attribute List<String> identifierOrUniqueKeyEmbeddedPropertyNames = metamodel.getJpaProvider() .getIdentifierOrUniqueKeyEmbeddedPropertyNames(node.getEntityType(), pathReference.getField()); if (identifierOrUniqueKeyEmbeddedPropertyNames.size() == 1) { // This "fix" only works if we have a single id attribute String naturalIdAttribute = identifierOrUniqueKeyEmbeddedPropertyNames.get(0); ExtendedManagedType extendedManagedType = metamodel.getManagedType(ExtendedManagedType.class, pathReference.getType().getJavaType()); if (!extendedManagedType.getIdAttribute().getName().equals(naturalIdAttribute)) { // Now we finally know the natural id attribute name return naturalIdAttribute; } } } } return null; }
subAttributes = new HashSet<>(); EntityType<?> entity = evm.getMetamodel().getEntityMetamodel().getEntity(entityClass); for (String propertyName : evm.getJpaProvider().getIdentifierOrUniqueKeyEmbeddedPropertyNames(entity, mappingPrefix + attribute.getName())) { subAttributes.add(managedType.getAttribute(propertyName));