From ae4e2a7deb249fc557bf720dbe4fd973e7d478d8 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Mon, 4 Dec 2017 11:45:49 +0100 Subject: [PATCH] DATAJDBC-158 - BasicJdbcPersistentEntityInformation honors Persistable implementations. --- .../jdbc/core/DefaultDataAccessStrategy.java | 9 +- .../BasicJdbcPersistentEntityInformation.java | 14 +++ .../support/JdbcRepositoryFactory.java | 6 +- ...cPersistentEntityInformationUnitTests.java | 91 +++++++++++++++++++ 4 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 src/test/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformationUnitTests.java diff --git a/src/main/java/org/springframework/data/jdbc/core/DefaultDataAccessStrategy.java b/src/main/java/org/springframework/data/jdbc/core/DefaultDataAccessStrategy.java index 6c1b0a3ab..e43ad1f3f 100644 --- a/src/main/java/org/springframework/data/jdbc/core/DefaultDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/jdbc/core/DefaultDataAccessStrategy.java @@ -24,11 +24,7 @@ import java.util.stream.StreamSupport; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.NonTransientDataAccessException; -import org.springframework.data.jdbc.mapping.model.BasicJdbcPersistentEntityInformation; -import org.springframework.data.jdbc.mapping.model.JdbcMappingContext; -import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntity; -import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntityInformation; -import org.springframework.data.jdbc.mapping.model.JdbcPersistentProperty; +import org.springframework.data.jdbc.mapping.model.*; import org.springframework.data.jdbc.support.JdbcUtil; import org.springframework.data.mapping.PropertyHandler; import org.springframework.data.mapping.PropertyPath; @@ -233,9 +229,10 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy { return parameters; } + @SuppressWarnings("unchecked") private ID getIdValueOrNull(S instance, JdbcPersistentEntity persistentEntity) { - EntityInformation entityInformation = new BasicJdbcPersistentEntityInformation<>(persistentEntity); + EntityInformation entityInformation = (EntityInformation) context.getRequiredPersistentEntityInformation(persistentEntity.getType()); ID idValue = entityInformation.getId(instance); diff --git a/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformation.java b/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformation.java index 5c139365d..673074d71 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformation.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformation.java @@ -15,7 +15,9 @@ */ package org.springframework.data.jdbc.mapping.model; +import org.springframework.data.domain.Persistable; import org.springframework.data.repository.core.support.PersistentEntityInformation; +import org.springframework.lang.Nullable; /** * @author Jens Schauder @@ -33,6 +35,18 @@ public class BasicJdbcPersistentEntityInformation extends PersistentEntit this.persistentEntity = persistentEntity; } + @Override + public boolean isNew(T entity) { + return entity instanceof Persistable ? ((Persistable) entity).isNew() : super.isNew(entity); + } + + @SuppressWarnings("unchecked") + @Nullable + @Override + public ID getId(T entity) { + return entity instanceof Persistable ? ((Persistable)entity).getId() : super.getId(entity); + } + /* * (non-Javadoc) * @see org.springframework.data.jdbc.mapping.model.JdbcPersistentEntityInformation#setId(java.lang.Object, java.util.Optional) diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java index a50d89294..cadda57b0 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java @@ -18,9 +18,7 @@ package org.springframework.data.jdbc.repository.support; import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.jdbc.core.DataAccessStrategy; import org.springframework.data.jdbc.core.JdbcEntityTemplate; -import org.springframework.data.jdbc.mapping.model.BasicJdbcPersistentEntityInformation; import org.springframework.data.jdbc.mapping.model.JdbcMappingContext; -import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntity; import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntityInformation; import org.springframework.data.jdbc.repository.SimpleJdbcRepository; import org.springframework.data.repository.core.EntityInformation; @@ -50,9 +48,7 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { @SuppressWarnings("unchecked") @Override public EntityInformation getEntityInformation(Class aClass) { - - JdbcPersistentEntity persistentEntity = context.getRequiredPersistentEntity(aClass); - return new BasicJdbcPersistentEntityInformation<>((JdbcPersistentEntity) persistentEntity); + return (EntityInformation) context.getRequiredPersistentEntityInformation(aClass); } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformationUnitTests.java b/src/test/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformationUnitTests.java new file mode 100644 index 000000000..71536fe99 --- /dev/null +++ b/src/test/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentEntityInformationUnitTests.java @@ -0,0 +1,91 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jdbc.mapping.model; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +import org.junit.Test; +import org.springframework.data.annotation.Id; +import org.springframework.data.domain.Persistable; +import org.springframework.lang.Nullable; + +/** + * @author Jens Schauder + */ +public class BasicJdbcPersistentEntityInformationUnitTests { + + JdbcMappingContext context = new JdbcMappingContext(new DefaultNamingStrategy(), cs -> {}); + private DummyEntity dummyEntity = new DummyEntity(); + private PersistableDummyEntity persistableDummyEntity = new PersistableDummyEntity(); + + @Test // DATAJDBC-158 + public void idIsBasedOnIdAnnotatedProperty() { + + dummyEntity.id = 42L; + assertThat(context.getRequiredPersistentEntityInformation(DummyEntity.class).getRequiredId(dummyEntity)) + .isEqualTo(42L); + } + + @Test // DATAJDBC-158 + public void idIsBasedOnPersistableGetId() { + + assertThat( // + context.getRequiredPersistentEntityInformation(PersistableDummyEntity.class) + .getRequiredId(persistableDummyEntity) // + ).isEqualTo(23L); + } + + @Test // DATAJDBC-158 + public void isNewIsBasedOnIdAnnotatedPropertyBeingNull() { + + assertThat(context.getRequiredPersistentEntityInformation(DummyEntity.class).isNew(dummyEntity)).isTrue(); + dummyEntity.id = 42L; + assertThat(context.getRequiredPersistentEntityInformation(DummyEntity.class).isNew(dummyEntity)).isFalse(); + } + + @Test // DATAJDBC-158 + public void isNewIsBasedOnPersistableIsNew() { + + persistableDummyEntity.isNewFlag = true; + assertThat( + context.getRequiredPersistentEntityInformation(PersistableDummyEntity.class).isNew(persistableDummyEntity)) + .isTrue(); + + persistableDummyEntity.isNewFlag = false; + assertThat( + context.getRequiredPersistentEntityInformation(PersistableDummyEntity.class).isNew(persistableDummyEntity)) + .isFalse(); + } + + private static class DummyEntity { + @Id Long id; + } + + private static class PersistableDummyEntity implements Persistable { + boolean isNewFlag; + + @Nullable + @Override + public Long getId() { + return 23L; + } + + @Override + public boolean isNew() { + return isNewFlag; + } + } +}