如果junit测试被包装为事务性,则Hibernate为一对多关系返回null

时间:2016-08-26 06:33:49

标签: java spring hibernate transactions

我有一对多关系,其中“孩子”是懒惰的。如果使用此设置运行junit测试,我将遇到org.hibernate.LazyInitializationException - 我已经寻找了大量可能的解决方案(我不愿意将fetch类型设置为渴望更简单地测试内容)

但是,如果我将我的测试注释为@Transactional,我将不会收到错误,但它将为实体子项返回null。

我以某种方式理解懒惰的提取异常,但如果我在同一个事务中,为什么我不能懒得取东西呢?例如:

@Transactional
@Test
public function test() {
  ParentEntity parentEntity = parentEntityService.read(requestContext, p.getId());
  Set<ChildEntity> childEntitites = parentEntity.getChildren();

  Assert.assertNotNull(childEntities); // will fail
}

没有@Transactional的同样会导致延迟提取异常。我已经使用了

  • 使用它后的parentEntity上的Hibernate.initialize()
  • 获取entityManager的实例并手动打开和关闭交易

有什么想法吗?

**编辑**

@Entity
@Table(name = "T_PARENTENTITY")
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "SEQ_PARENTENTITY")
public class ParentEntity extends BaseEntity{

    @Getter @Setter
    @NotNull @NotEmpty
    @Column(name="STRING_1")
    private String string1;

    @Getter @Setter
    @OneToMany(orphanRemoval = true)
    @JoinColumn(name="PARENTENTITY_ID", updatable = false)
    @JsonView(View.DetailView.class)
    private Set<ChildEntity> children;
}

0 个答案:

没有答案