【发布时间】:2017-12-10 13:35:32
【问题描述】:
我发现很多人得到这个异常,但找不到
为什么这发生在我身上:)。怎么会这样
在@Transactional 方法内,当
我指的是在同一方法中从 db 加载的对象?
实体不应分离,会话应相同...但这不起作用。
我的对象中有一个延迟启动的属性,当尝试
从中读到,Hibernate 声明“没有会话”,但是是什么导致关闭它?据我了解,休眠会话应该在 @Transactional 方法中一直存在,直到它完成为止。
我尝试将@Transactional 标记为我的@Test 方法并且它有效。
但我希望在一个测试方法中调用很少的 @Transactional 方法,因为我必须保存实体并将它们加载到单独的会话中。这是因为我使用@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)
...
【问题讨论】:
标签: java spring hibernate session junit