Spring Problem

This commit is contained in:
2022-07-02 20:18:53 +03:00
parent c16b1a86a6
commit f9e1710b2f
11 changed files with 106 additions and 98 deletions

Binary file not shown.

11
pom.xml
View File

@@ -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>

View File

@@ -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));
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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
);
}

View File

@@ -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>

View File

@@ -0,0 +1,6 @@
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true