hibernate-reactive-repository

Spring WebFlux + Spring Data + Hibernate Reactive

Spring WebFlux and Spring Data don't support Hibernate Reactive natively and you will need to do some boilerplate code work.

If you are familiar with Spring-Data-JPA and the following code snippet

public interface UserRepository extends JpaRepository<User, Long> {

}

You can use the ReactiveHibernateCrudRepository interface in a reactive way

public interface UserRepository extends ReactiveHibernateCrudRepository<User, Long> {
    
}

Usage

  1. Create a spring-webflux project pom.xml looks like
<properties>
    <java.version>17</java.version>
</properties>
<dependences>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>io.smallrye.reactive</groupId>
        <artifactId>mutiny-reactor</artifactId>
        <version>1.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.github.mbr.hibernate</groupId>
        <artifactId>hibernate-reactive-repository</artifactId>
        <version>1.0.6-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-mysql-client</artifactId>
        <version>4.3.7</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependences>
  1. Create an entity class
import lombok.*;
import javax.persistence.*;

@Getter
@Setter

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Long id;

    @Column(name = "name")
    public String name;
}
  1. Create the hibernate reactive repository
public interface UserRepository extends ReactiveHibernateCrudRepository<User, Long> {
    
}
  1. Create a Controller
import org.springframework.beans.factory.annotation.Autowired;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    public Flux<User> getAllUsers() {
        return userRepository.findAll();
    }
}
  1. run app
>mvn spring-boot:run

spring-devtools class loader issue resolution

if you are using spring-boot-devtools
create spring-devtools.properties in the following path [PROJECT_PATH]/src/main/resources/META-INF

add the content below and save

restart.include.hibernate-reactive-repository=/hibernate-reactive-repository.*.jar