diff --git a/pom.xml b/pom.xml index 5b01293e..1edc4928 100644 --- a/pom.xml +++ b/pom.xml @@ -36,9 +36,10 @@ UTF-8 - 21 + 21 + 21 - 3.5.4 + 4.0.0 12.1.9 0.8.14 @@ -121,16 +122,19 @@ org.testcontainers postgresql + 1.21.3 test org.testcontainers mysql + 1.21.3 test org.testcontainers oracle-xe + 1.21.3 test diff --git a/src/main/java/nl/_42/jarb/autoconfigure/JarbAutoConfig.java b/src/main/java/nl/_42/jarb/autoconfigure/JarbAutoConfig.java index bdd29596..a76a4bb2 100644 --- a/src/main/java/nl/_42/jarb/autoconfigure/JarbAutoConfig.java +++ b/src/main/java/nl/_42/jarb/autoconfigure/JarbAutoConfig.java @@ -5,7 +5,7 @@ import nl._42.jarb.constraint.metadata.BeanConstraintService; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; +import org.springframework.boot.hibernate.autoconfigure.HibernatePropertiesCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; diff --git a/src/main/java/nl/_42/jarb/constraint/metadata/DefaultBeanConstraintDescriptor.java b/src/main/java/nl/_42/jarb/constraint/metadata/DefaultBeanConstraintDescriptor.java index c1b39bde..4b336621 100644 --- a/src/main/java/nl/_42/jarb/constraint/metadata/DefaultBeanConstraintDescriptor.java +++ b/src/main/java/nl/_42/jarb/constraint/metadata/DefaultBeanConstraintDescriptor.java @@ -3,6 +3,9 @@ */ package nl._42.jarb.constraint.metadata; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Size; import nl._42.jarb.constraint.metadata.database.BeanMetadataRepository; import nl._42.jarb.constraint.metadata.enhance.AnnotationPropertyTypeEnhancer; import nl._42.jarb.constraint.metadata.enhance.ClassPropertyTypeEnhancer; @@ -19,6 +22,7 @@ import nl._42.jarb.constraint.metadata.enhance.PatternPropertyConstraintEnhancer; import nl._42.jarb.constraint.metadata.enhance.PropertyTypeEnhancer; import nl._42.jarb.utils.Classes; +import org.hibernate.validator.constraints.Length; import java.math.BigDecimal; import java.time.LocalDate; @@ -82,7 +86,7 @@ private void registerDefaultEnhancers() { } private void registerJavaxValidationEnhancers() { - register(new LengthPropertyConstraintEnhancer<>(jakarta.validation.constraints.Size.class, (x) -> x.min(), (x) -> x.max())); + register(new LengthPropertyConstraintEnhancer<>(jakarta.validation.constraints.Size.class, Size::min, Size::max)); register(new NotNullPropertyConstraintEnhancer()); register(new NotEmptyPropertyConstraintEnhancer(jakarta.validation.constraints.NotEmpty.class)); @@ -91,12 +95,12 @@ private void registerJavaxValidationEnhancers() { register(new PatternPropertyConstraintEnhancer()); register(new DigitsPropertyConstraintEnhancer()); - register(new MinPropertyConstraintEnhancer<>(jakarta.validation.constraints.Min.class, (x) -> x.value())); + register(new MinPropertyConstraintEnhancer<>(jakarta.validation.constraints.Min.class, Min::value)); register(new MinPropertyConstraintEnhancer<>(jakarta.validation.constraints.DecimalMin.class, (x) -> new BigDecimal(x.value()))); register(new MinPropertyConstraintEnhancer<>(jakarta.validation.constraints.Positive.class, (x) -> 0)); register(new MinPropertyConstraintEnhancer<>(jakarta.validation.constraints.PositiveOrZero.class, (x) -> 0)); - register(new MaxPropertyConstraintEnhancer<>(jakarta.validation.constraints.Max.class, (x) -> x.value())); + register(new MaxPropertyConstraintEnhancer<>(jakarta.validation.constraints.Max.class, Max::value)); register(new MaxPropertyConstraintEnhancer<>(jakarta.validation.constraints.DecimalMax.class, (x) -> new BigDecimal(x.value()))); register(new MaxPropertyConstraintEnhancer<>(jakarta.validation.constraints.Negative.class, (x) -> 0)); register(new MaxPropertyConstraintEnhancer<>(jakarta.validation.constraints.NegativeOrZero.class, (x) -> 0)); @@ -105,9 +109,7 @@ private void registerJavaxValidationEnhancers() { } private void registerHibernateValidationEnhancers() { - register(new LengthPropertyConstraintEnhancer<>(org.hibernate.validator.constraints.Length.class, (x) -> x.min(), (x) -> x.max())); - register(new NotEmptyPropertyConstraintEnhancer(org.hibernate.validator.constraints.NotEmpty.class)); - register(new AnnotationPropertyTypeEnhancer(org.hibernate.validator.constraints.Email.class, "email")); + register(new LengthPropertyConstraintEnhancer<>(org.hibernate.validator.constraints.Length.class, Length::min, Length::max)); register(new AnnotationPropertyTypeEnhancer(org.hibernate.validator.constraints.CreditCardNumber.class, "credid_card")); register(new AnnotationPropertyTypeEnhancer(org.hibernate.validator.constraints.URL.class, "url")); } diff --git a/src/main/java/nl/_42/jarb/utils/orm/hibernate/HibernateJpaSchemaMapper.java b/src/main/java/nl/_42/jarb/utils/orm/hibernate/HibernateJpaSchemaMapper.java index aa8c873a..eff496b0 100644 --- a/src/main/java/nl/_42/jarb/utils/orm/hibernate/HibernateJpaSchemaMapper.java +++ b/src/main/java/nl/_42/jarb/utils/orm/hibernate/HibernateJpaSchemaMapper.java @@ -9,12 +9,15 @@ import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.ManagedMappingType; +import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.internal.BasicAttributeMapping; import org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping; import org.hibernate.metamodel.mapping.internal.EmbeddedCollectionPart; import org.hibernate.metamodel.model.domain.NavigableRole; import org.hibernate.metamodel.spi.RuntimeMetamodelsImplementor; +import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.entity.AbstractEntityPersister; +import org.hibernate.persister.entity.SingleTableEntityPersister; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,19 +63,18 @@ private ColumnReference getColumnName(AbstractEntityPersister model, PropertyRef } AttributeMapping attribute = getAttribute(model, property); - if (attribute.isPluralAttributeMapping()) { - return getCollectionColumnName(model, property); + if (attribute.isPluralAttributeMapping() && attribute instanceof PluralAttributeMapping collection) { + return getCollectionColumnName(collection, property); } else { - return getComponentColumnName(model, property); + return getComponentColumnName(attribute, property); } } private ColumnReference getPropertyColumnName(AbstractEntityPersister model, String propertyName) { - String propertyTableName = model.getPropertyTableName(propertyName); - String tableName = Objects.toString(propertyTableName, model.getTableName()); - - String[] columnNames = model.getPropertyColumnNames(propertyName); - return new ColumnReference(tableName, columnNames[0]); + String columnName = model.getPropertyColumnNames(propertyName)[0]; + String columnTableName = model.getTableNameForColumn(columnName); + String tableName = Objects.toString(columnTableName, model.getTableName()); + return new ColumnReference(tableName, columnName); } private AttributeMapping getAttribute(AbstractEntityPersister model, PropertyReference property) { @@ -85,18 +87,16 @@ private AttributeMapping getAttribute(AbstractEntityPersister model, PropertyRef return attribute; } - private ColumnReference getCollectionColumnName(AbstractEntityPersister model, PropertyReference property) { - NavigableRole role = new NavigableRole(model.getNavigableRole(), property.getParent().getPropertyName()).appendContainer("{element}"); - EmbeddedCollectionPart embedded = (EmbeddedCollectionPart) metamodels.getEmbedded(role); + private ColumnReference getCollectionColumnName(PluralAttributeMapping attribute, PropertyReference property) { + EmbeddedCollectionPart embedded = (EmbeddedCollectionPart) attribute.getElementDescriptor(); AttributeMapping mapping = getAttributeMapping(embedded.getEmbeddableTypeDescriptor(), property.getSimpleName()); return getColumnName(mapping); } - private ColumnReference getComponentColumnName(AbstractEntityPersister model, PropertyReference property) { - NavigableRole role = new NavigableRole(model.getNavigableRole(), property.getParent().getPropertyName()); - EmbeddedAttributeMapping embedded = (EmbeddedAttributeMapping) metamodels.getEmbedded(role); - AttributeMapping mapping = getAttributeMapping(embedded.getMappedType(), property.getSimpleName()); - return getColumnName(mapping); + private ColumnReference getComponentColumnName(AttributeMapping attribute, PropertyReference property) { + SingleTableEntityPersister type = (SingleTableEntityPersister) attribute.getDeclaringType(); + var columns = type.getPropertyColumnNames(property.getPropertyName()); + return new ColumnReference(type.getTableName(), columns[0]); } private AttributeMapping getAttributeMapping(ManagedMappingType type, String name) { diff --git a/src/test/java/nl/_42/jarb/Application.java b/src/test/java/nl/_42/jarb/Application.java index a1aa8970..18d261ea 100644 --- a/src/test/java/nl/_42/jarb/Application.java +++ b/src/test/java/nl/_42/jarb/Application.java @@ -4,7 +4,7 @@ import nl._42.jarb.domain.Car; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication