gpt4 book ai didi

spring-boot - org.hibernate.LazyInitializationException : failed to lazily initialize a collection of role: FQPropretyName, 无法初始化代理 - 没有 session

转载 作者:行者123 更新时间:2023-12-04 03:00:27 26 4
gpt4 key购买 nike

我正在尝试使用 SpringBoot、SpringDataJpa 以及使用 SpringBootTest 进行单元测试的多对一双向关联。但是测试失败,堆栈跟踪如下所示。但是我无法找到原因。任何指针都会有所帮助

ManyToOne双向关联的Spring Boot JUnit测试失败。

    @Test
public void testFindByRegionIdEquals() {
Region region = regionService.findByRegionIdEquals(1L);
Region expectedRegion = new Region(1L, "Europe");
assertThat(region).isNotNull().isEqualTo(expectedRegion);
assertThat(region.getCountries()).isNotEmpty().doesNotContainNull().size().isEqualTo(8);
}

异常堆栈跟踪
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: zikzakjack.domain.Region.countries, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:204)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:148)
at org.hibernate.collection.internal.PersistentSet.isEmpty(PersistentSet.java:149)
at org.assertj.core.util.IterableUtil.isNullOrEmpty(IterableUtil.java:35)
at org.assertj.core.internal.Iterables.assertNotEmpty(Iterables.java:152)
at org.assertj.core.api.AbstractIterableAssert.isNotEmpty(AbstractIterableAssert.java:145)
at zikzakjack.service.RegionServiceTests.testFindByRegionIdEquals(RegionServiceTests.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

拥有实体 ManyToOne
@Data
@Entity
@Table(name = "COUNTRIES")
public class Country implements Serializable, Comparable<Country> {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "COUNTRY_ID")
private String countryId;

@Column(name = "COUNTRY_NAME")
private String countryName;

@ManyToOne
@JoinColumn(name = "REGION_ID")
private Region region;

public Country() {

}

public Country(String countryId, String countryName, Region region) {
super();
this.countryId = countryId;
this.countryName = countryName;
this.region = region;
}

}

*非-拥有实体 OneToMany 和mappedBy *
@Data
@Entity
@Table(name = "REGIONS")
public class Region implements Serializable, Comparable<Region> {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "REGION_ID")
private Long regionId;

@Column(name = "REGION_NAME")
private String regionName;

@OneToMany(mappedBy = "region", fetch = FetchType.LAZY)
private Set<Country> countries = new HashSet<Country>();

public Region() {
}

public Region(Long regionId, String regionName) {
this.regionId = regionId;
this.regionName = regionName;
}

public Region(String regionName) {
this.regionName = regionName;
}

public void addCountry(Country country) {
countries.add(country);
country.setRegion(this);
}
}

最佳答案

好吧,我从这篇文章中找到了答案 https://stackoverflow.com/a/38690930/5266568

在 application.properties 中添加以下配置修复了问题:

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

另一个对我有用的解决方案,但请注意,我仍然需要更多地了解它是如何真正解决问题的

@Transactional 确保该测试方法中的所有方法调用都发生在同一边界内。
    @Test
@Transactional
public void testFindByRegionIdEquals() {
Region region = regionService.findByRegionIdEquals(1L);
Region expectedRegion = new Region(1L, "Europe");
assertThat(region).isNotNull().isEqualTo(expectedRegion);
assertThat(region.getCountries()).isNotEmpty().doesNotContainNull().size().isEqualTo(8);
}

关于spring-boot - org.hibernate.LazyInitializationException : failed to lazily initialize a collection of role: FQPropretyName, 无法初始化代理 - 没有 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46259878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com