当前位置: 首页 > 知识库问答 >
问题:

LazyInitializationExceptionSpring引导

屠锐
2023-03-14

为了简单起见,没有提供getter、setter、ToString和构造函数。我能够保存对象到数据库和数据库已经填充。

@Entity
@Table(catalog = "spring_project")
public class Car {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String model;

@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable( name = "car_color", catalog = "spring_project",
            joinColumns         = { @JoinColumn(name = "car_id") },
            inverseJoinColumns  = { @JoinColumn(name = "colors_id") }
)
private List<Color> colors = new ArrayList<>();

@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="brand_id", referencedColumnName="id")
private Brand brand;
@Entity
@Table(catalog = "spring_project")
public class Brand {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

@OneToMany(mappedBy = "brand", fetch = FetchType.LAZY)
private List<Car> cars = new ArrayList<>();
@Entity
@Table(catalog = "spring_project")
public class Color {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;

如果我像Eager一样获取,一切都运行得很好,但我知道这是一种不好的做法,应该使用懒惰加载。但我一直得到LazyInitializationException。

我从错误中了解到需要一个会话,但我不知道如何提供一个,因为我使用的是Spring Data JPA,也不应该在哪里声明一个...

@SpringBootApplication
public class SrpingJpaApplication {

private static final Logger log = 
LoggerFactory.getLogger(SrpingJpaApplication.class);

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

@Bean
public CommandLineRunner demo(CarRepository carRepository,
                              ColorRepository colorRepository,
                              BrandRepository brandRepository) {
    return (args) -> {

        log.info("Reads all cars....");
        for (Car c : carRepository.findAll()) {
            System.out.println(c.toString());
        }

    };
}

在c.toString()上抛出错误;

错误:由:org.hibernate.lazyInitializationException引起:无法初始化代理[com.readiness.moita.srpingjpa.models.brand#1]-没有会话

共有1个答案

松嘉颖
2023-03-14

因为brandfetchtype是惰性的,所以它不会通过调用fetchall()自动加载到会话中。要将其自动加载到会话中,您需要:

改变

@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="brand_id", referencedColumnName="id")
private Brand brand;

@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="brand_id", referencedColumnName="id")
private Brand brand;
@Component
public CarService implements ICarService {

    @Autowired
    CarRepository carRepository;

    @Transactional
    public void printAllCars() {
        for (Car c : carRepository.findAll()) {
            System.out.println(c.toString());
        }
    }   
}
 类似资料:
  • 本章介绍: 引导客户端和服务器 从Channel引导客户端 添加 ChannelHandler 使用 ChannelOption 和属性 正如我们所见,ChannelPipeline 、ChannelHandler和编解码器提供工具,我们可以处理一个广泛的数据处理需求。但是你可能会问,“我创建了组件后,如何将其组装形成一个应用程序?” 答案是“bootstrapping(引导)”。到目前为止我们使

  • 我试图从我的Spring启动服务向IBMMQ队列发送消息。配置如下: 一个pplication.properties 菜豆 IBM MQ浏览器图片 当我尝试发送消息时,我收到错误: 我错过了什么?我的chammel类型所显示的错误与我的请求不符,但我不知道这意味着什么。 提前谢谢。

  • 作为R新手,我很难引导ICC输出。我首先设法使用ICC包计算“正常”ICC,没有任何问题(ICCbare(subject,variable,ICC)),但当我试图得到一些自举估计值时,情况变得更糟。。。 我一开始是 并在引导程序中输入icc_引导,如下所示: 然而,我得到一个错误消息说"未定义的列选择",我哪里出错了? 这是我的一个小数据输出

  • 引导Angular 2应用程序肯定不同于Angular 1.x,但仍然是一个简单的过程。让我们来看看如何做到这一点。

  • 我正试图将