Skip to content

Commit

Permalink
Add support for testing with Spring 6 in the hibernate-types-60 module
Browse files Browse the repository at this point in the history
  • Loading branch information
vladmihalcea committed Aug 23, 2022
1 parent 1d19eb9 commit b0a81d9
Show file tree
Hide file tree
Showing 7 changed files with 415 additions and 12 deletions.
97 changes: 85 additions & 12 deletions hibernate-types-60/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,76 @@
<version>${jakarta-bind.api.version}</version>
</dependency>

<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>${hikari.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring-data.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<!-- Testing -->

<dependency>
Expand All @@ -92,11 +162,19 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>test</scope>
</dependency>

</dependencies>

<properties>
<jdk.version>11</jdk.version>
<jdk-test.version>11</jdk-test.version>
<jdk-test.version>17</jdk-test.version>

<hibernate.version>6.0.2.Final</hibernate.version>
<postgresql.version>42.4.1</postgresql.version>
Expand All @@ -110,6 +188,11 @@
<jaxb-api.version>2.3.0</jaxb-api.version>
<jakarta-bind.api.version>3.0.1</jakarta-bind.api.version>

<hikari.version>4.0.3</hikari.version>
<aspectj.version>1.8.7</aspectj.version>
<spring.version>6.0.0-M5</spring.version>
<spring-data.version>3.0.0-M5</spring-data.version>

</properties>

<build>
Expand All @@ -120,17 +203,7 @@
<version>${maven-compiler-plugin.version}</version>
<configuration>
<release>${jdk.version}</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<jvm>${env.JAVA_HOME_11}/bin/java</jvm>
<excludes>
<exclude>**/*JvmForkTest.java</exclude>
</excludes>
<testRelease>${jdk-test.version}</testRelease>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.vladmihalcea.spring.base.config;

import com.vladmihalcea.hibernate.util.logging.InlineQueryLogEntryCreator;
import com.vladmihalcea.hibernate.util.providers.DataSourceProvider;
import com.vladmihalcea.hibernate.util.providers.PostgreSQLDataSourceProvider;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import net.ttddyy.dsproxy.listener.logging.SLF4JQueryLoggingListener;
import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionTemplate;

import jakarta.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

/**
*
* @author Vlad Mihalcea
*/
@Configuration
@EnableTransactionManagement
@EnableAspectJAutoProxy
public abstract class SpringDataJPABaseConfiguration {

private DataSourceProvider dataSourceProvider = new PostgreSQLDataSourceProvider();

@Bean
public static PropertySourcesPlaceholderConfigurer propertySources() {
return new PropertySourcesPlaceholderConfigurer();
}

@Bean(destroyMethod = "close")
public HikariDataSource actualDataSource() {
Properties properties = new Properties();
properties.setProperty("maximumPoolSize", String.valueOf(3));
HikariConfig hikariConfig = new HikariConfig(properties);
hikariConfig.setAutoCommit(false);
hikariConfig.setDataSource(dataSourceProvider.dataSource());
return new HikariDataSource(hikariConfig);
}

@Bean
public DataSource dataSource() {
SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
DataSource dataSource = ProxyDataSourceBuilder
.create(actualDataSource())
.name("DATA_SOURCE_PROXY")
.listener(loggingListener)
.build();
return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setPersistenceUnitName(getClass().getSimpleName());
entityManagerFactoryBean.setPersistenceProvider(new HibernatePersistenceProvider());
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan(packagesToScan());

JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
entityManagerFactoryBean.setJpaProperties(properties());
return entityManagerFactoryBean;
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}

@Bean
public TransactionTemplate transactionTemplate(EntityManagerFactory entityManagerFactory) {
return new TransactionTemplate(transactionManager(entityManagerFactory));
}

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}

protected Properties properties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", dataSourceProvider.hibernateDialect());
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
additionalProperties(properties);
return properties;
}

protected void additionalProperties(Properties properties) {
}

protected String[] packagesToScan() {
return new String[]{
packageToScan()
};
}

protected String packageToScan() {
return "com.vladmihalcea.book.hpjp.hibernate.forum";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.vladmihalcea.spring.repository;

import com.vladmihalcea.spring.repository.domain.Post;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
* @author Vlad Mihalcea
*/
@Repository
public interface PostRepository extends JpaRepository<Post, Long>, HibernateRepository<Post> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package com.vladmihalcea.spring.repository;

import com.vladmihalcea.spring.repository.config.SpringDataJPASaveConfiguration;
import com.vladmihalcea.spring.repository.domain.Post;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.LongStream;

import static org.junit.Assert.fail;

/**
* @author Vlad Mihalcea
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringDataJPASaveConfiguration.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class SpringDataJPASaveTest {

protected final Logger LOGGER = LoggerFactory.getLogger(getClass());

@Autowired
private TransactionTemplate transactionTemplate;

@Autowired
private PostRepository postRepository;

@PersistenceContext
private EntityManager entityManager;

@Test
public void testPersistAndMerge() {
String slug = "high-performance-java-persistence";

transactionTemplate.execute((TransactionCallback<Void>) transactionStatus -> {
postRepository.persist(
new Post()
.setId(1L)
.setTitle("High-Performance Java Persistence")
.setSlug("high-performance-java-persistence")
);

postRepository.persistAndFlush(
new Post()
.setId(2L)
.setTitle("Hypersistence Optimizer")
.setSlug("hypersistence-optimizer")
);

postRepository.peristAllAndFlush(
LongStream.range(3, 1000)
.mapToObj(i -> new Post()
.setId(i)
.setTitle(String.format("Post %d", i))
.setSlug(String.format("post-%d", i))
)
.collect(Collectors.toList())
);

return null;
});

List<Post> posts = transactionTemplate.execute(transactionStatus ->
entityManager.createQuery(
"select p " +
"from Post p " +
"where p.id < 10", Post.class)
.getResultList()
);

posts.forEach(post -> post.setTitle(post.getTitle() + " rocks!"));

transactionTemplate.execute(transactionStatus ->
postRepository.updateAll(posts)
);
}

@Test
public void testSave() {
try {
transactionTemplate.execute((TransactionCallback<Void>) transactionStatus -> {
postRepository.save(
new Post()
.setId(1L)
.setTitle("High-Performance Java Persistence")
.setSlug("high-performance-java-persistence")
);
return null;
});

fail("Should throw UnsupportedOperationException!");
} catch (UnsupportedOperationException expected) {
LOGGER.warn("You shouldn't call the JpaRepository save method!");
}
}
}

0 comments on commit b0a81d9

Please sign in to comment.