Merge pull request #10103 from sampada07/JAVA-2432

JAVA-2432: Move articles out of spring-hibernate4
This commit is contained in:
Dhawal Kapil
2020-09-29 18:33:00 +05:30
committed by GitHub
103 changed files with 230 additions and 514 deletions
@@ -9,4 +9,5 @@ This module contains articles about enterprise concerns such as Multitenancy, Er
- [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions)
- [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions)
- [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set)
- [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels)
- [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels)
- [Hibernate: save, persist, update, merge, saveOrUpdate](https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate)
@@ -61,13 +61,25 @@
<version>${byte-buddy.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>${hsqldb.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>geodb-repo</id>
<name>GeoDB repository</name>
<url>http://repo.boundlessgeo.com/main/</url>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
@@ -77,6 +89,7 @@
<mariaDB4j.version>2.2.3</mariaDB4j.version>
<assertj-core.version>3.8.0</assertj-core.version>
<geodb.version>0.9</geodb.version>
<hsqldb.version>2.3.4</hsqldb.version>
</properties>
</project>
@@ -1,6 +1,14 @@
package com.baeldung.persistence.save;
import com.baeldung.persistence.model.Person;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import javax.persistence.PersistenceException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@@ -8,9 +16,13 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.dialect.HSQLDialect;
import org.hibernate.service.ServiceRegistry;
import org.junit.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import com.baeldung.persistence.model.Person;
/**
* Testing specific implementation details for different methods:
@@ -21,12 +33,19 @@ public class SaveMethodsIntegrationTest {
private static SessionFactory sessionFactory;
private Session session;
private boolean doNotCommit = false;
@BeforeClass
public static void beforeTests() {
Configuration configuration = new Configuration().addAnnotatedClass(Person.class).setProperty("hibernate.dialect", HSQLDialect.class.getName()).setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName())
.setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test").setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "").setProperty("hibernate.hbm2ddl.auto", "update");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
Configuration configuration = new Configuration().addAnnotatedClass(Person.class)
.setProperty("hibernate.dialect", HSQLDialect.class.getName())
.setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName())
.setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test")
.setProperty("hibernate.connection.username", "sa")
.setProperty("hibernate.connection.password", "")
.setProperty("hibernate.hbm2ddl.auto", "update");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
@@ -34,6 +53,7 @@ public class SaveMethodsIntegrationTest {
public void setUp() {
session = sessionFactory.openSession();
session.beginTransaction();
doNotCommit = false;
}
@Test
@@ -43,7 +63,8 @@ public class SaveMethodsIntegrationTest {
person.setName("John");
session.persist(person);
session.getTransaction().commit();
session.getTransaction()
.commit();
session.close();
session = sessionFactory.openSession();
@@ -68,15 +89,33 @@ public class SaveMethodsIntegrationTest {
assertEquals(id1, id2);
}
@Test(expected = HibernateException.class)
@Test(expected = PersistenceException.class)
public void whenPersistDetached_thenThrowsException() {
doNotCommit = true;
Person person = new Person();
person.setName("John");
session.persist(person);
session.evict(person);
session.persist(person);
}
@Test
public void whenMergeDetached_thenEntityUpdatedFromDatabase() {
Person person = new Person();
person.setName("John");
session.save(person);
session.flush();
session.evict(person);
person.setName("Mary");
Person mergedPerson = (Person) session.merge(person);
assertNotSame(person, mergedPerson);
assertEquals("Mary", mergedPerson.getName());
}
@@ -92,7 +131,8 @@ public class SaveMethodsIntegrationTest {
assertNotNull(id);
session.getTransaction().commit();
session.getTransaction()
.commit();
session.close();
assertEquals(id, person.getId());
@@ -128,22 +168,6 @@ public class SaveMethodsIntegrationTest {
}
@Test
public void whenMergeDetached_thenEntityUpdatedFromDatabase() {
Person person = new Person();
person.setName("John");
session.save(person);
session.evict(person);
person.setName("Mary");
Person mergedPerson = (Person) session.merge(person);
assertNotSame(person, mergedPerson);
assertEquals("Mary", mergedPerson.getName());
}
@Test
public void whenMergeTransient_thenNewEntitySavedToDatabase() {
@@ -151,7 +175,8 @@ public class SaveMethodsIntegrationTest {
person.setName("John");
Person mergedPerson = (Person) session.merge(person);
session.getTransaction().commit();
session.getTransaction()
.commit();
session.beginTransaction();
assertNull(person.getId());
@@ -227,7 +252,8 @@ public class SaveMethodsIntegrationTest {
person.setName("John");
session.saveOrUpdate(person);
session.getTransaction().commit();
session.getTransaction()
.commit();
session.close();
session = sessionFactory.openSession();
@@ -250,7 +276,10 @@ public class SaveMethodsIntegrationTest {
@After
public void tearDown() {
session.getTransaction().commit();
if (!doNotCommit) {
session.getTransaction()
.commit();
}
session.close();
}
+1 -2
View File
@@ -81,8 +81,7 @@
<module>spring-data-redis</module>
<module>spring-data-solr</module>
<module>spring-hibernate-3</module>
<module>spring-hibernate-5</module> <!-- long running -->
<module>spring-hibernate4</module>
<module>spring-hibernate-5</module> <!-- long running -->
<module>spring-jpa</module>
<module>spring-jpa-2</module>
<module>spring-jdbc</module>
@@ -6,6 +6,12 @@ This module contains articles about querying data using Spring Data JPA
- [Spring Data JPA @Query Annotation](https://www.baeldung.com/spring-data-jpa-query)
- [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
- [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date)
- [Hibernate Pagination](https://www.baeldung.com/hibernate-pagination)
- [Sorting with Hibernate](https://www.baeldung.com/hibernate-sort)
- [Stored Procedures with Hibernate](https://www.baeldung.com/stored-procedures-with-hibernate-tutorial)
- [Eager/Lazy Loading In Hibernate](https://www.baeldung.com/hibernate-lazy-eager-loading)
- [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa)
- More articles: [[<-- prev]](../spring-data-jpa-query)
### Eclipse Config
@@ -18,6 +18,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
@@ -28,6 +32,55 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>${jta.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>${tomcat-dbcp.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
@@ -35,5 +88,10 @@
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
<junit-jupiter.version>5.6.2</junit-jupiter.version>
<junit.version>4.13</junit.version>
<tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
<jta.version>1.1</jta.version>
<guava.version>21.0</guava.version>
<!-- persistence -->
<hibernate.version>5.2.10.Final</hibernate.version>
</properties>
</project>
@@ -1,4 +1,4 @@
package com.baeldung.spring;
package com.baeldung.config;
import java.util.Properties;
@@ -15,8 +15,8 @@ import org.springframework.dao.annotation.PersistenceExceptionTranslationPostPro
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@@ -47,7 +47,7 @@ import com.google.common.base.Preconditions;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager")
@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager", entityManagerFactoryRef = "jpaEntityManager")
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
@PropertySource({ "classpath:persistence-h2.properties" })
@ComponentScan({ "com.baeldung.persistence" })
@@ -75,7 +75,7 @@ public class PersistenceConfig {
return sessionFactory;
}
@Bean
@Bean("jpaEntityManager")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(restDataSource());
@@ -1,4 +1,4 @@
package com.baeldung.spring;
package com.baeldung.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -9,11 +9,10 @@ import org.springframework.security.core.context.SecurityContextHolder;
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public String getCurrentAuditor() {
public Optional<String> getCurrentAuditor() {
return Optional.ofNullable(SecurityContextHolder.getContext())
.map(e -> e.getAuthentication())
.map(Authentication::getName)
.orElse(null);
.map(Authentication::getName);
}
}
@@ -1,9 +0,0 @@
package com.baeldung.persistence.dao;
import com.baeldung.persistence.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface BookRepository extends JpaRepository<Book, Long>, BookRepositoryCustom, JpaSpecificationExecutor<Book> {
}
@@ -1,11 +0,0 @@
package com.baeldung.persistence.dao;
import com.baeldung.persistence.model.Book;
import java.util.List;
public interface BookRepositoryCustom {
List<Book> findBooksByAuthorNameAndTitle(String authorName, String title);
}
@@ -1,44 +0,0 @@
package com.baeldung.persistence.dao;
import com.baeldung.persistence.model.Book;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
@Repository
public class BookRepositoryImpl implements BookRepositoryCustom {
private EntityManager em;
public BookRepositoryImpl(EntityManager em) {
this.em = em;
}
@Override
public List<Book> findBooksByAuthorNameAndTitle(String authorName, String title) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> cq = cb.createQuery(Book.class);
Root<Book> book = cq.from(Book.class);
List<Predicate> predicates = new ArrayList<>();
if (authorName != null) {
predicates.add(cb.equal(book.get("author"), authorName));
}
if (title != null) {
predicates.add(cb.like(book.get("title"), "%" + title + "%"));
}
cq.where(predicates.toArray(new Predicate[0]));
TypedQuery<Book> query = em.createQuery(cq);
return query.getResultList();
}
}
@@ -1,25 +0,0 @@
package com.baeldung.persistence.dao;
import com.baeldung.persistence.model.Book;
import org.springframework.stereotype.Service;
import java.util.List;
import static com.baeldung.persistence.dao.BookSpecifications.hasAuthor;
import static com.baeldung.persistence.dao.BookSpecifications.titleContains;
import static org.springframework.data.jpa.domain.Specification.where;
@Service
public class BookService {
private BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
public List<Book> query(String author, String title) {
return bookRepository.findAll(where(hasAuthor(author)).and(titleContains(title)));
}
}
@@ -1,16 +0,0 @@
package com.baeldung.persistence.dao;
import com.baeldung.persistence.model.Book;
import org.springframework.data.jpa.domain.Specification;
public class BookSpecifications {
public static Specification<Book> hasAuthor(String author) {
return (book, cq, cb) -> cb.equal(book.get("author"), author);
}
public static Specification<Book> titleContains(String title) {
return (book, cq, cb) -> cb.like(book.get("title"), "%" + title + "%");
}
}

Some files were not shown because too many files have changed in this diff Show More