From 8a64d17244b2a0bee8f193b4a9307cc74abdb465 Mon Sep 17 00:00:00 2001 From: Vlad Mihalcea Date: Sat, 10 Sep 2022 09:37:06 +0300 Subject: [PATCH] The findAll method from the JpaRepository is an Anti-Pattern and the HibernateRepository should deprecate it #483 --- .../repository/HibernateRepository.java | 13 ++++++++---- .../repository/HibernateRepositoryImpl.java | 15 +++++++++----- .../spring/repository/PostRepository.java | 2 +- .../repository/SpringDataJPASaveTest.java | 14 +++++++++++++ .../repository/HibernateRepository.java | 13 ++++++++---- .../repository/HibernateRepositoryImpl.java | 15 +++++++++----- .../spring/repository/PostRepository.java | 2 +- .../repository/SpringDataJPASaveTest.java | 14 +++++++++++++ .../repository/HibernateRepository.java | 20 +++++++++++++++---- .../repository/HibernateRepositoryImpl.java | 15 +++++++++----- .../spring/repository/PostRepository.java | 2 +- .../repository/SpringDataJPASaveTest.java | 14 +++++++++++++ 12 files changed, 109 insertions(+), 30 deletions(-) diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java b/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java index fc0fc44b8..88bc898ab 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java @@ -14,7 +14,12 @@ */ public interface HibernateRepository { - //Save methods will trigger an UnsupportedOperationException + //The findAll method will trigger an UnsupportedOperationException + + @Deprecated + List findAll(); + + //The save methods will trigger an UnsupportedOperationException @Deprecated S save(S entity); @@ -28,7 +33,7 @@ public interface HibernateRepository { @Deprecated List saveAllAndFlush(Iterable entities); - //Persist methods are meant to save newly created entities + //The persist methods are meant to save newly created entities S persist(S entity); @@ -38,7 +43,7 @@ public interface HibernateRepository { List peristAllAndFlush(Iterable entities); - //Merge methods are meant to propagate detached entity state changes + //The merge methods are meant to propagate detached entity state changes //if they are really needed S merge(S entity); @@ -49,7 +54,7 @@ public interface HibernateRepository { List mergeAllAndFlush(Iterable entities); - //Update methods are meant to force the detached entity state changes + //The update methods are meant to force the detached entity state changes S update(S entity); diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java b/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java index 158c0a944..d4a8ff373 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java @@ -19,24 +19,29 @@ public class HibernateRepositoryImpl implements HibernateRepository { @PersistenceContext private EntityManager entityManager; + @Override + public List findAll() { + throw new UnsupportedOperationException("Fetching all records from a given database table is a terrible idea!"); + } + @Override public S save(S entity) { - return unsupported(); + return unsupportedSave(); } @Override public List saveAll(Iterable entities) { - return unsupported(); + return unsupportedSave(); } @Override public S saveAndFlush(S entity) { - return unsupported(); + return unsupportedSave(); } @Override public List saveAllAndFlush(Iterable entities) { - return unsupported(); + return unsupportedSave(); } public S persist(S entity) { @@ -161,7 +166,7 @@ protected Session session() { return entityManager.unwrap(Session.class); } - protected S unsupported() { + protected S unsupportedSave() { throw new UnsupportedOperationException("There's no such thing as a save method in JPA, so don't use this hack!"); } } diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java b/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java index 93ca9b818..3211c9141 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java @@ -8,6 +8,6 @@ * @author Vlad Mihalcea */ @Repository -public interface PostRepository extends JpaRepository, HibernateRepository { +public interface PostRepository extends HibernateRepository, JpaRepository { } diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java index 9de5b0a53..2fd04d483 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java @@ -105,5 +105,19 @@ public void testSave() { LOGGER.warn("You shouldn't call the JpaRepository save method!"); } } + + @Test + public void testFindAll() { + try { + transactionTemplate.execute((TransactionCallback) transactionStatus -> { + postRepository.findAll(); + return null; + }); + + fail("Should throw UnsupportedOperationException!"); + } catch (UnsupportedOperationException expected) { + LOGGER.warn("You shouldn't call the JpaRepository findAll method!"); + } + } } diff --git a/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java b/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java index fc0fc44b8..88bc898ab 100644 --- a/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java +++ b/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java @@ -14,7 +14,12 @@ */ public interface HibernateRepository { - //Save methods will trigger an UnsupportedOperationException + //The findAll method will trigger an UnsupportedOperationException + + @Deprecated + List findAll(); + + //The save methods will trigger an UnsupportedOperationException @Deprecated S save(S entity); @@ -28,7 +33,7 @@ public interface HibernateRepository { @Deprecated List saveAllAndFlush(Iterable entities); - //Persist methods are meant to save newly created entities + //The persist methods are meant to save newly created entities S persist(S entity); @@ -38,7 +43,7 @@ public interface HibernateRepository { List peristAllAndFlush(Iterable entities); - //Merge methods are meant to propagate detached entity state changes + //The merge methods are meant to propagate detached entity state changes //if they are really needed S merge(S entity); @@ -49,7 +54,7 @@ public interface HibernateRepository { List mergeAllAndFlush(Iterable entities); - //Update methods are meant to force the detached entity state changes + //The update methods are meant to force the detached entity state changes S update(S entity); diff --git a/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java b/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java index 158c0a944..d4a8ff373 100644 --- a/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java +++ b/hibernate-types-55/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java @@ -19,24 +19,29 @@ public class HibernateRepositoryImpl implements HibernateRepository { @PersistenceContext private EntityManager entityManager; + @Override + public List findAll() { + throw new UnsupportedOperationException("Fetching all records from a given database table is a terrible idea!"); + } + @Override public S save(S entity) { - return unsupported(); + return unsupportedSave(); } @Override public List saveAll(Iterable entities) { - return unsupported(); + return unsupportedSave(); } @Override public S saveAndFlush(S entity) { - return unsupported(); + return unsupportedSave(); } @Override public List saveAllAndFlush(Iterable entities) { - return unsupported(); + return unsupportedSave(); } public S persist(S entity) { @@ -161,7 +166,7 @@ protected Session session() { return entityManager.unwrap(Session.class); } - protected S unsupported() { + protected S unsupportedSave() { throw new UnsupportedOperationException("There's no such thing as a save method in JPA, so don't use this hack!"); } } diff --git a/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java b/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java index f96aeae72..5698fcf00 100644 --- a/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java +++ b/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java @@ -8,6 +8,6 @@ * @author Vlad Mihalcea */ @Repository -public interface PostRepository extends JpaRepository, HibernateRepository { +public interface PostRepository extends HibernateRepository, JpaRepository { } diff --git a/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java b/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java index 609227c6f..b703aac15 100644 --- a/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java +++ b/hibernate-types-55/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java @@ -106,5 +106,19 @@ public void testSave() { LOGGER.warn("You shouldn't call the JpaRepository save method!"); } } + + @Test + public void testFindAll() { + try { + transactionTemplate.execute((TransactionCallback) transactionStatus -> { + postRepository.findAll(); + return null; + }); + + fail("Should throw UnsupportedOperationException!"); + } catch (UnsupportedOperationException expected) { + LOGGER.warn("You shouldn't call the JpaRepository findAll method!"); + } + } } diff --git a/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java b/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java index 16eef8da3..88bc898ab 100644 --- a/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java +++ b/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepository.java @@ -3,11 +3,23 @@ import java.util.List; /** + * The {@code HibernateRepository} fixes the problems that the default Spring Data {@code JpaRepository} + * suffers from. + * + * For more details about how to use it, check out this article. + * * @author Vlad Mihalcea + * @version 2.17.0 */ public interface HibernateRepository { - //Save methods will trigger an UnsupportedOperationException + //The findAll method will trigger an UnsupportedOperationException + + @Deprecated + List findAll(); + + //The save methods will trigger an UnsupportedOperationException @Deprecated S save(S entity); @@ -21,7 +33,7 @@ public interface HibernateRepository { @Deprecated List saveAllAndFlush(Iterable entities); - //Persist methods are meant to save newly created entities + //The persist methods are meant to save newly created entities S persist(S entity); @@ -31,7 +43,7 @@ public interface HibernateRepository { List peristAllAndFlush(Iterable entities); - //Merge methods are meant to propagate detached entity state changes + //The merge methods are meant to propagate detached entity state changes //if they are really needed S merge(S entity); @@ -42,7 +54,7 @@ public interface HibernateRepository { List mergeAllAndFlush(Iterable entities); - //Update methods are meant to force the detached entity state changes + //The update methods are meant to force the detached entity state changes S update(S entity); diff --git a/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java b/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java index 504670083..0747f5589 100644 --- a/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java +++ b/hibernate-types-60/src/main/java/com/vladmihalcea/spring/repository/HibernateRepositoryImpl.java @@ -19,24 +19,29 @@ public class HibernateRepositoryImpl implements HibernateRepository { @PersistenceContext private EntityManager entityManager; + @Override + public List findAll() { + throw new UnsupportedOperationException("Fetching all records from a given database table is a terrible idea!"); + } + @Override public S save(S entity) { - return unsupported(); + return unsupportedSave(); } @Override public List saveAll(Iterable entities) { - return unsupported(); + return unsupportedSave(); } @Override public S saveAndFlush(S entity) { - return unsupported(); + return unsupportedSave(); } @Override public List saveAllAndFlush(Iterable entities) { - return unsupported(); + return unsupportedSave(); } public S persist(S entity) { @@ -161,7 +166,7 @@ protected Session session() { return entityManager.unwrap(Session.class); } - protected S unsupported() { + protected S unsupportedSave() { throw new UnsupportedOperationException("There's no such thing as a save method in JPA, so don't use this hack!"); } } diff --git a/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java b/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java index 93ca9b818..3211c9141 100644 --- a/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java +++ b/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/PostRepository.java @@ -8,6 +8,6 @@ * @author Vlad Mihalcea */ @Repository -public interface PostRepository extends JpaRepository, HibernateRepository { +public interface PostRepository extends HibernateRepository, JpaRepository { } diff --git a/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java b/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java index e28c34264..ce8600334 100644 --- a/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java +++ b/hibernate-types-60/src/test/java/com/vladmihalcea/spring/repository/SpringDataJPASaveTest.java @@ -105,5 +105,19 @@ public void testSave() { LOGGER.warn("You shouldn't call the JpaRepository save method!"); } } + + @Test + public void testFindAll() { + try { + transactionTemplate.execute((TransactionCallback) transactionStatus -> { + postRepository.findAll(); + return null; + }); + + fail("Should throw UnsupportedOperationException!"); + } catch (UnsupportedOperationException expected) { + LOGGER.warn("You shouldn't call the JpaRepository findAll method!"); + } + } }