【问题标题】:Spring Junit Hibernate @Transactional - no SessionSpring Junit Hibernate @Transactional - 无会话
【发布时间】: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


    【解决方案1】:

    @Transactional 不适用于私有方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      相关资源
      最近更新 更多