diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java index ddccb4f6e..1e79ce588 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.repository.jpa; import java.io.Serializable; +import java.util.List; import java.util.Optional; import org.eclipse.hawkbit.repository.jpa.model.AbstractJpaTenantAwareBaseEntity; @@ -40,4 +41,18 @@ public interface BaseEntityRepository findById(I id); + /** + * Overrides + * {@link org.springframework.data.repository.CrudRepository#saveAll(Iterable)} + * to return a list of created entities instead of an instance of + * {@link Iterable} to be able to work with it directly in further code + * processing instead of converting the {@link Iterable}. + * + * @param entities + * to persist in the database + * @return the created entities + */ + @Override + @Transactional + List saveAll(Iterable entities); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java index 35dd03ba0..9d1881e93 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java @@ -748,7 +748,9 @@ public class JpaTargetManagement implements TargetManagement { @Retryable(include = { ConcurrencyFailureException.class }, maxAttempts = Constants.TX_RT_MAX, backoff = @Backoff(delay = Constants.TX_RT_DELAY)) public List create(final Collection targets) { - return targets.stream().map(this::create).collect(Collectors.toList()); + final List targetList = targets.stream().map(JpaTargetCreate.class::cast).map(JpaTargetCreate::build) + .collect(Collectors.toList()); + return Collections.unmodifiableList(targetRepository.saveAll(targetList)); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TargetRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TargetRepository.java index 59d7501a5..c0d21ec38 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TargetRepository.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/TargetRepository.java @@ -20,7 +20,6 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; import org.eclipse.hawkbit.repository.jpa.specifications.TargetSpecifications; import org.eclipse.hawkbit.repository.model.Target; -import org.eclipse.hawkbit.repository.model.TargetType; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity; import org.springframework.data.domain.Page; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetSpecifications.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetSpecifications.java index 9e6397fc5..ff988638b 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetSpecifications.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetSpecifications.java @@ -148,7 +148,7 @@ public final class TargetSpecifications { return (targetRoot, query, cb) -> { final Predicate predicate = targetRoot.get(JpaTarget_.controllerId).in(controllerIDs); - targetRoot.fetch(JpaTarget_.assignedDistributionSet); + targetRoot.fetch(JpaTarget_.assignedDistributionSet, JoinType.LEFT); return predicate; }; } diff --git a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/TestdataFactory.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/TestdataFactory.java index 87f5a5ecb..052ed5536 100644 --- a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/TestdataFactory.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/TestdataFactory.java @@ -880,7 +880,7 @@ public class TestdataFactory { targets.add(entityFactory.target().create().controllerId(DEFAULT_CONTROLLER_ID + i)); } - return targetManagement.create(targets); + return createTargets(targets); } /** @@ -904,7 +904,7 @@ public class TestdataFactory { .targetType(targetType.getId())); } - return targetManagement.create(targets); + return createTargets(targets); } /** @@ -922,7 +922,7 @@ public class TestdataFactory { targets.add(entityFactory.target().create().controllerId(targetId)); } - return targetManagement.create(targets); + return createTargets(targets); } /** @@ -987,11 +987,19 @@ public class TestdataFactory { public List createTargets(final int numberOfTargets, final String controllerIdPrefix, final String descriptionPrefix) { - return targetManagement.create(IntStream.range(0, numberOfTargets) + final List targets = IntStream.range(0, numberOfTargets) .mapToObj(i -> entityFactory.target().create() .controllerId(String.format("%s-%05d", controllerIdPrefix, i)) .description(descriptionPrefix + i)) - .collect(Collectors.toList())); + .collect(Collectors.toList()); + return createTargets(targets); + } + + private List createTargets(final Collection targetCreates) { + // init new instance of array list since the TargetManagement#create will + // provide a unmodifiable list + final List createdTargets = targetManagement.create(targetCreates); + return new ArrayList<>(createdTargets); } /** @@ -1010,11 +1018,12 @@ public class TestdataFactory { public List createTargets(final int numberOfTargets, final String controllerIdPrefix, final String descriptionPrefix, final Long lastTargetQuery) { - return targetManagement.create(IntStream.range(0, numberOfTargets) + final List targets = IntStream.range(0, numberOfTargets) .mapToObj(i -> entityFactory.target().create() .controllerId(String.format("%s-%05d", controllerIdPrefix, i)) .description(descriptionPrefix + i).lastTargetQuery(lastTargetQuery)) - .collect(Collectors.toList())); + .collect(Collectors.toList()); + return createTargets(targets); } /**