我知道有很多类似的帖子,但是我无法从那些帖子中弄清楚如何解决这个问题。
我有三个类:Car(汽车)、Brand(品牌)和Color(颜色)。 一辆汽车只属于一个品牌并且有一个颜色列表。 品牌有一个汽车列表。 颜色没有任何关系。
为了简单起见,未提供Getter、Setter、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一样获取数据,一切都运行得很好,但我知道这是不好的做法,应该使用Lazy加载。但我一直收到LazyInitializationException。
从错误中我理解需要一个session,但我不知道如何提供一个,因为我使用的是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();
错误:Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [com.readiness.moita.SrpingJPA.Models.Brand#1] - no Session
demo
方法上加上@Transactional
注解,这样 Spring 就会处理会话管理。 - Aditya Narayan Dixit