java-LazyInitializationException春季启动
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-LazyInitializationException春季启动,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3144字,纯文字阅读大概需要5分钟。
内容图文
![java-LazyInitializationException春季启动](/upload/InfoBanner/zyjiaocheng/687/b9fc1f6582e64fe9a02bddb65daff23d.jpg)
我知道那里有很多类似的线程,但是我无法从那些线程中弄清楚如何克服这个问题.
我有3类汽车,品牌,颜色.
一辆汽车只有一个品牌和一系列颜色.
品牌有汽车清单.
颜色没有任何关系.
为了简单起见,未提供Getter,Setters,ToString和Constructor.
我能够将对象保存到数据库中,并且数据库已经填充.
————————————————– ——————————
@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]-无会话
解决方法:
由于Brand的FetchType是惰性的,因此不会通过调用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;
如果不想将获取类型设置为eager,则需要将对toString的调用移至服务方法Ex
@Component
public CarService implements ICarService {
@Autowired
CarRepository carRepository;
@Transactional
public void printAllCars() {
for (Car c : carRepository.findAll()) {
System.out.println(c.toString());
}
}
}
但是,执行此操作的正确方法是编写条件查询或hql
内容总结
以上是互联网集市为您收集整理的java-LazyInitializationException春季启动全部内容,希望文章能够帮你解决java-LazyInitializationException春季启动所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。