gpt4 book ai didi

java - Spring Junit Hibernate @Transactional - 无 session

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:22 28 4
gpt4 key购买 nike

我发现很多人得到这个异常,但找不到为什么这会发生在我身上 :)。怎么会这样在 @Transactional 方法中,当我指的是在同一方法中从数据库加载的对象?

实体不应该被分离, session 应该是相同的......但这行不通。

我的对象中有一个延迟启动的属性,当尝试从中读到,Hibernate 声明“没有 session ”,但是什么导致关闭它?据我了解,hibernate session 应该在 @Transactional 方法中存在,直到它完成。

我试图标记 @Transactional 我的 @Test 方法并且它有效。

但我希望在一个测试方法中调用几个@Transactional 方法,因为我必须保存实体并在单独的 session 中加载它们。这是因为我使用了 @OrderBy 并且只有从数据库加载对象时它才有效。

这里是测试类:

@Test
public void getOpenTest() {
...
Advertisement closedAdvertisement = closeAdvertisement(initialAdvertisement.getId());
...
}

//this method inside same test class
@Transactional
private Advertisement closeAdvertisement(Long id){
Advertisement advertisement = advertisementRepository.findOne(id);

//*** CRASHES HERE ***
//The method is @Transactional. Why session closed here?
advertisement.getStatusChronology().get(0);

...
}

存储库

@Repository
public interface AdvertisementRepository extends CrudRepository<Advertisement, Long> {
//Simple request just to load entity
@Query("select ad "
+ " from Advertisement ad")
public List<Advertisement>getOpen();
}

实体

@Entity
@Table(name = "advertisement")
public class Advertisement {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
...
@OneToMany(mappedBy = "advertisement", cascade = CascadeType.ALL)
@OrderBy("updated DESC")
List<Status> statusChronology;
...
}

@Entity
@Table(name = "status")
public class Status {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;

@ManyToOne
@JoinColumn(name = "statusChronology")
private Advertisement advertisement;

@NotNull
@Column(name = "is_open")
private Boolean isOpen;

@NotNull
@Column
private LocalDateTime updated;

...
}

异常

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: web.scraper.database.model.Advertisement.statusChronology, could not initialize proxy - no Session
...
at web.scraper.database.repository.AdvertisementRepositoryTest.closeAdvertisement(AdvertisementRepositoryTest.java:80)
at web.scraper.database.repository.AdvertisementRepositoryTest.getOpenTest(AdvertisementRepositoryTest.java:107)
...

最佳答案

@Transactional 不适用于私有(private)方法。

关于java - Spring Junit Hibernate @Transactional - 无 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44950691/

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