junit中的lazy-loaded集合为空

e37o9pze  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(305)

我有一个springboot应用程序,我在其中定义了一个实体,如下所示

@Entity
public class Organisation {

@Id
@GeneratedValue
@JsonIgnore
private Long id;

private String entityId;

@OneToMany(mappedBy = "parent")
@Where(clause = "active_ind=true")
@JsonIgnore
private Set<Organisation> activeSubOrgs = new HashSet<>();

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentId")
private Organisation parent;

public Set<Organisation> getActiveSubOrgs() {
    return activeSubOrgs;
}

在我的服务类中,我有一个函数来获取孩子们

public Set<Organisation> getChildrenForEntity(String entityId) {
    Organisation parent = organisationRepository.findByEntityIdAndActiveInd(entityId, true);
    return parent.getActiveSubOrgs();
}

这工作得很好,当从rest控制器调用时会得到子级,但是当我在junit中使用相同的函数进行测试时,它总是返回空的。在我的sql跟踪日志中,我看到在调用getactivesuborgs()时没有触发查询。我的junit测试如下

@SpringBootTest
@RunWith(SpringRunner.class)
@Transactional
public class OrgServiceTest {

    @Autowired
    private OrganisationService organisationService;

    @Before
    public void setup() {
        Organisation company = new Organisation("c", true);
        company = organisationRepository.save(company);
        Organisation circle = new Organisation("circle1", true);
        circle.setParent(company);
        circle = organisationRepository.save(circle);
        Organisation div1 = new Organisation("div1", true);
        div1.setParent(circle);
        div1 = organisationRepository.save(div1);
    }

    @Test
    public void getChildrenForEntitySuccessTest() {
        Set<Organisation> children = organisationService.getChildrenForEntity("c");
        System.out.println(children.iterator().next().getEntityId());
        assertEquals("circle1", children.iterator().next().getEntityId());
    }

测试中设置的子项是空的,而实际上应该有圆圈1。我曾尝试对子级调用hibernate.initialize(),但也没有成功。

5ssjco0h

5ssjco0h1#

问题是,双向关系必须在双方都得到更新,即父母和子女必须相互了解。在你的职责范围内 setup() ,您只需定义子级的父级。因此,每个孩子都知道自己的父母。但是,家长不知道自己的孩子。
对于双向关系,一个很好的处理方法是为一个类定义一个函数来设置/添加属性,并自动更新另一个类。万一 OneToMany 关系,这可以很好地处理 add(entity) 功能。

public void addActiveSubOrg(Organisation activeSubOrg) {
    this.activeSubOrgs.add(activeSubOrgs);
    activeSubOrg.setParent(activeSubOrg);
}

相关问题