首页 > 解决方案 > Spring Data JPA Hibernate - LazyInitializationException

问题描述

我在 Spring Boot 和 Hibernate 中有一个项目。以前的实体在 Eclipselink 上运行,但已适应 JPA 标准。每次我尝试下载单个对象时,都会出现异常:

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [com.example.demo.model2.Color # 19] - no Session

据我所知,此消息与@OneToMany、@ManyToOne 关系一起出现。但是我创建了一个新的示例项目。甚至对于没有 @OneToMany 的实体也是同样的问题。我不知道怎么了。可能是什么原因?

实体颜色:

package com.example.demo.model2;  
import lombok.Data;  
import javax.persistence.*;  
@Data  
@Entity  
@Table(name = "COLOR")  
@SequenceGenerator(name = "seq_color", sequenceName = "seq_color", allocationSize = 1)  
public class Color {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_color")
private Long id;
private String bluecolor = "";
private String redcolor = "";
private String greencolor = "";
private int index = 0; }

存储库:

@Repository
public interface ColorRepository extends JpaRepository<Color, Long> {
}

简单服务:

@Service
public class SimplyService{

    @Autowired
    ColorRepository colorRepository;

    @EventListener(ApplicationReadyEvent.class)
    void test(){
        Color color= colorRepository.getOne(19L);
        playlist.getBluecolor();
    }
}

演示应用:

@EnableJpaRepositories("com.example.demo.repository")
@SpringBootApplication
@EntityScan("com.example.demo.model2")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

应用程序属性:

spring.datasource.url= jdbc:postgresql://localhost:5432/database
spring.datasource.username=base
spring.datasource.password=base
spring.jpa.hibernate.ddl-auto=none
spring.datasource.driver-class-name=org.postgresql.Driver

Postgresql 颜色表:

CREATE TABLE public.color
(
    id bigint NOT NULL,
    bluecolor character varying(255) COLLATE pg_catalog."default",
    index integer,
    redcolor character varying(255) COLLATE pg_catalog."default",
    greencolor character varying(255) COLLATE pg_catalog."default",
    CONSTRAINT t_color_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.color
    OWNER to base;

标签: javaspringhibernatejpa

解决方案


getOne()来电EntityManager.getReference()。它返回一个未初始化的代理,甚至不去数据库。当您想要将您知道存在的实体附加到您正在创建或修改的另一个实体时,这很有用。

要从数据库中获取数据,请使用findById(),而不是getOne()


推荐阅读