有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring数据JPA Hibernate LazyInitializationException

我有一个关于SpringBoot和Hibernate的项目。以前的实体在Eclipselink上运营,但根据JPA标准进行了调整。 每次尝试下载单个对象时,都会出现异常:

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

据我所知,这条消息出现在@OneToMany,@ManyToOne relations中。但我创建了一个新的示例项目。即使对于一个没有@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> {
}

SimplyService:

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

共 (1) 个答案

  1. # 1 楼答案

    getOne()调用EntityManager.getReference()。它返回一个未初始化的代理,甚至不去数据库。当您希望将已知存在的实体附加到正在创建或修改的另一个实体时,这一点非常有用

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