mirror of
https://github.com/Example-uPagge/hibernate-multiple-bag-fetch-exception.git
synced 2024-06-15 10:55:24 +03:00
Spring Problem
This commit is contained in:
BIN
data/demo.mv.db
BIN
data/demo.mv.db
Binary file not shown.
11
pom.xml
11
pom.xml
@@ -3,6 +3,12 @@
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.7.1</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
|
||||
<groupId>dev.struchkov.example.hibernate</groupId>
|
||||
<artifactId>hibernate-multiple-bag-fetch-exception</artifactId>
|
||||
@@ -15,9 +21,8 @@
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.orm</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>6.1.0.Final</version>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
package dev.struchkov.example.hibernate.nbfe.fix;
|
||||
|
||||
import dev.struchkov.example.hibernate.nbfe.fix.domain.Post;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.EntityManagerFactory;
|
||||
import jakarta.persistence.Persistence;
|
||||
import org.hibernate.annotations.QueryHints;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class FixProblem {
|
||||
|
||||
public static void main(String[] args) {
|
||||
final EntityManagerFactory emf = Persistence.createEntityManagerFactory("Blog");
|
||||
final EntityManager entityManager = emf.createEntityManager();
|
||||
|
||||
final long startTime = System.currentTimeMillis();
|
||||
List<Post> posts = entityManager.createQuery("""
|
||||
select distinct p
|
||||
from Post p
|
||||
left join fetch p.comments
|
||||
where p.id between :minId and :maxId""", Post.class)
|
||||
.setParameter("minId", 1L)
|
||||
.setParameter("maxId", 50L)
|
||||
.getResultList();
|
||||
|
||||
posts = entityManager.createQuery("""
|
||||
select distinct p
|
||||
from Post p
|
||||
left join fetch p.tags t
|
||||
where p in :posts""", Post.class)
|
||||
.setParameter("posts", posts)
|
||||
.getResultList();
|
||||
|
||||
final long finishTime = System.currentTimeMillis();
|
||||
System.out.println("Performance: " + (finishTime - startTime));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package dev.struchkov.example.hibernate.nbfe.fix.domain;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
public class Tag {
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package dev.struchkov.example.spring.nbfe;
|
||||
|
||||
import dev.struchkov.example.spring.nbfe.domain.Post;
|
||||
import dev.struchkov.example.spring.nbfe.repository.PostRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.event.ContextStartedEvent;
|
||||
import org.springframework.context.event.EventListener;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@SpringBootApplication
|
||||
@RequiredArgsConstructor
|
||||
public class SpringApp {
|
||||
|
||||
private final PostRepository postRepository;
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringApp.class, args);
|
||||
}
|
||||
|
||||
@EventListener
|
||||
public void run(ContextStartedEvent event) {
|
||||
final long start = System.currentTimeMillis();
|
||||
final List<Post> allWithCommentsAndTags = postRepository.findAllWithCommentsAndTags(1, 50);
|
||||
final long finish = System.currentTimeMillis();
|
||||
System.out.println(finish - start);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,16 +1,16 @@
|
||||
package dev.struchkov.example.hibernate.nbfe.fix.domain;
|
||||
package dev.struchkov.example.spring.nbfe.domain;
|
||||
|
||||
import jakarta.persistence.CascadeType;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.JoinTable;
|
||||
import jakarta.persistence.ManyToMany;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.OneToMany;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
package dev.struchkov.example.hibernate.nbfe.fix.domain;
|
||||
package dev.struchkov.example.spring.nbfe.domain;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToOne;
|
||||
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
@@ -0,0 +1,22 @@
|
||||
package dev.struchkov.example.spring.nbfe.domain;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
public class Tag {
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package dev.struchkov.example.spring.nbfe.repository;
|
||||
|
||||
import dev.struchkov.example.spring.nbfe.domain.Post;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface PostRepository extends JpaRepository<Post, Long> {
|
||||
|
||||
@Query("""
|
||||
select distinct p
|
||||
from Post p
|
||||
left join fetch p.comments
|
||||
left join fetch p.tags
|
||||
where p.id between :minId and :maxId
|
||||
""")
|
||||
List<Post> findAllWithCommentsAndTags(
|
||||
@Param("minId") long minId,
|
||||
@Param("maxId") long maxId
|
||||
);
|
||||
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
<persistence
|
||||
version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
|
||||
http://xmlns.jcp.org/xml/ns/persistence_2_1.xsd">
|
||||
|
||||
<persistence-unit name="Blog">
|
||||
<class>dev.struchkov.example.hibernate.nbfe.fix.domain.Post</class>
|
||||
<class>dev.struchkov.example.hibernate.nbfe.fix.domain.PostComment</class>
|
||||
<class>dev.struchkov.example.hibernate.nbfe.fix.domain.Tag</class>
|
||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||
<properties>
|
||||
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
|
||||
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:file:./data/demo"/>
|
||||
<property name="jakarta.persistence.jdbc.user" value="sa"/>
|
||||
<property name="jakarta.persistence.jdbc.password" value=""/>
|
||||
<property name="jakarta.persistence.schema-generation.database.action" value="none"/>
|
||||
<property name="hibernate.format_sql" value="true"/>
|
||||
<property name="hibernate.use_sql_comments" value="true"/>
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
|
||||
</persistence>
|
||||
6
src/main/resources/application.yml
Normal file
6
src/main/resources/application.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
spring:
|
||||
jpa:
|
||||
show-sql: true
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
Reference in New Issue
Block a user