java - 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;
解决方案
getOne()
来电EntityManager.getReference()
。它返回一个未初始化的代理,甚至不去数据库。当您想要将您知道存在的实体附加到您正在创建或修改的另一个实体时,这很有用。
要从数据库中获取数据,请使用findById()
,而不是getOne()
。
推荐阅读
- email - 由于 Spamhaus 列表,Sendgrid 电子邮件发送下降
- flutter - Flutter - SingleChildScrollView 不滚动到键盘打开的列底部
- reactjs - 使用 reactJS 制作推荐奖励系统
- java - 在杰克逊已经配置了原始超类型之后动态添加新的子类型
- ansible - 每个列表的第一项附加到 ansible playbook 中的另一个列表
- angular - 元标记未在 angular9 中更新(查看源代码)
- android - com.android.tools.r8.errors.a:仅从 Android O 开始支持 MethodHandle.invoke 和 MethodHandle.invokeExact
- wordpress - Next.js 可以在多站点模式下与 WordPress 一起使用吗?
- spring - 从实现 WebApplicationInitializer 的类访问 bean
- python - Scrapy登录,但不抓取任何东西