From b8e29431de793b8a2234e193ac68d7956c300969 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 7 Apr 2015 18:54:06 +0200 Subject: [PATCH] #73 - Added example how to customize all Spring Data repositories. --- .../jpa/customall/BaseRepository.java | 32 +++++++++++++ .../jpa/customall/CustomRepositoryConfig.java | 33 +++++++++++++ .../jpa/customall/ExtendedJpaRepository.java | 47 +++++++++++++++++++ .../springdata/jpa/customall/User.java | 32 +++++++++++++ .../jpa/customall/UserRepository.java | 24 ++++++++++ .../UserRepositoryCustomizationTests.java | 45 ++++++++++++++++++ 6 files changed, 213 insertions(+) create mode 100644 jpa/example/src/main/java/example/springdata/jpa/customall/BaseRepository.java create mode 100644 jpa/example/src/main/java/example/springdata/jpa/customall/CustomRepositoryConfig.java create mode 100644 jpa/example/src/main/java/example/springdata/jpa/customall/ExtendedJpaRepository.java create mode 100644 jpa/example/src/main/java/example/springdata/jpa/customall/User.java create mode 100644 jpa/example/src/main/java/example/springdata/jpa/customall/UserRepository.java create mode 100644 jpa/example/src/test/java/example/springdata/jpa/customall/UserRepositoryCustomizationTests.java diff --git a/jpa/example/src/main/java/example/springdata/jpa/customall/BaseRepository.java b/jpa/example/src/main/java/example/springdata/jpa/customall/BaseRepository.java new file mode 100644 index 00000000..15126c9f --- /dev/null +++ b/jpa/example/src/main/java/example/springdata/jpa/customall/BaseRepository.java @@ -0,0 +1,32 @@ +/* + * Copyright 2015 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 example.springdata.jpa.customall; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.NoRepositoryBean; + +/** + * A base repository interface declaring a custom method shared amongst all repositories. + * + * @author Oliver Gierke + * @see ExtendedJpaRepository + * @soundtrack Tim Neuhaus - As life found you (The Cabinet) + */ +@NoRepositoryBean +interface BaseRepository extends CrudRepository { + + long customMethod(); +} diff --git a/jpa/example/src/main/java/example/springdata/jpa/customall/CustomRepositoryConfig.java b/jpa/example/src/main/java/example/springdata/jpa/customall/CustomRepositoryConfig.java new file mode 100644 index 00000000..63344cee --- /dev/null +++ b/jpa/example/src/main/java/example/springdata/jpa/customall/CustomRepositoryConfig.java @@ -0,0 +1,33 @@ +/* + * Copyright 2015 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 example.springdata.jpa.customall; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +/** + * Sample configuration to bootstrap Spring Data JPA through JavaConfig. Note how Spring Data JPA is configured with a + * custom repository base class. This causes all repository interfaces being found for this configuration to use the + * configured class as base repository. + * + * @author Oliver Gierke + * @soundtrack Tim Neuhaus - As life found you (The Cabinet) + */ +@Configuration +@EnableAutoConfiguration +@EnableJpaRepositories(repositoryBaseClass = ExtendedJpaRepository.class) +class CustomRepositoryConfig {} diff --git a/jpa/example/src/main/java/example/springdata/jpa/customall/ExtendedJpaRepository.java b/jpa/example/src/main/java/example/springdata/jpa/customall/ExtendedJpaRepository.java new file mode 100644 index 00000000..92648e31 --- /dev/null +++ b/jpa/example/src/main/java/example/springdata/jpa/customall/ExtendedJpaRepository.java @@ -0,0 +1,47 @@ +/* + * Copyright 2015 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 example.springdata.jpa.customall; + +import javax.persistence.EntityManager; + +import org.springframework.data.jpa.repository.support.JpaEntityInformation; +import org.springframework.data.jpa.repository.support.SimpleJpaRepository; + +/** + * @author Oliver Gierke + * @soundtrack Elen - Nobody Else (Elen) + */ +class ExtendedJpaRepository extends SimpleJpaRepository implements BaseRepository { + + /** + * Creates a new {@link ExtendedJpaRepository} for the given {@link JpaEntityInformation} and {@link EntityManager}. + * + * @param entityInformation must not be {@literal null}. + * @param entityManager must not be {@literal null}. + */ + public ExtendedJpaRepository(JpaEntityInformation entityInformation, EntityManager entityManager) { + super(entityInformation, entityManager); + } + + /* + * (non-Javadoc) + * @see example.springdata.jpa.customall.BaseRepository#customMethod() + */ + @Override + public long customMethod() { + return 0; + } +} diff --git a/jpa/example/src/main/java/example/springdata/jpa/customall/User.java b/jpa/example/src/main/java/example/springdata/jpa/customall/User.java new file mode 100644 index 00000000..41958012 --- /dev/null +++ b/jpa/example/src/main/java/example/springdata/jpa/customall/User.java @@ -0,0 +1,32 @@ +/* + * Copyright 2015 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 example.springdata.jpa.customall; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * Sample user class. + * + * @author Oliver Gierke + * @soundtrack Tim Neuhaus - As life found you (The Cabinet) + */ +@Entity +public class User { + + private @Id @GeneratedValue Long id; +} diff --git a/jpa/example/src/main/java/example/springdata/jpa/customall/UserRepository.java b/jpa/example/src/main/java/example/springdata/jpa/customall/UserRepository.java new file mode 100644 index 00000000..2534048e --- /dev/null +++ b/jpa/example/src/main/java/example/springdata/jpa/customall/UserRepository.java @@ -0,0 +1,24 @@ +/* + * Copyright 2015 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 example.springdata.jpa.customall; + +/** + * Repository interface for {@link User} instances. + * + * @author Oliver Gierke + * @soundtrack Tim Neuhaus - As life found you (The Cabinet) + */ +public interface UserRepository extends BaseRepository {} diff --git a/jpa/example/src/test/java/example/springdata/jpa/customall/UserRepositoryCustomizationTests.java b/jpa/example/src/test/java/example/springdata/jpa/customall/UserRepositoryCustomizationTests.java new file mode 100644 index 00000000..33efa15e --- /dev/null +++ b/jpa/example/src/test/java/example/springdata/jpa/customall/UserRepositoryCustomizationTests.java @@ -0,0 +1,45 @@ +/* + * Copyright 2015 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 example.springdata.jpa.customall; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +/** + * Intergration test showing the usage of a custom method implemented for all repositories + * + * @author Oliver Gierke + * @soundtrack Elen - It's you (Elen) + */ +@RunWith(SpringJUnit4ClassRunner.class) +@Transactional +@ContextConfiguration(classes = CustomRepositoryConfig.class) +public class UserRepositoryCustomizationTests { + + @Autowired UserRepository repository; + + @Test + public void invokesCustomMethod() { + assertThat(repository.customMethod(), is(0L)); + } +}