繁体   English   中英

junit 中的延迟加载集合为空

[英]Lazy loaded collection empty in junit

我有一个 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;
}

在我的服务 class 我有一个 function 来接孩子

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

This works fine and gets the children when called from rest controller, but when I use the same function to test in junit, it always returns empty. 在我的 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());
    }

测试中的子集在实际应该有 circle1 时为空。 我曾尝试在儿童上调用 Hibernate.initialize() ,但这也不起作用。

问题是双向关系必须在双方更新,即父母和孩子必须相互了解。 在您的 function setup()中,您只需定义孩子的父母。 因此,每个孩子都知道自己的父母。 然而,父母并不知道它的孩子。

对于双向关系,处理此问题的一种好方法是为一个 class 定义一个 function 以设置/添加一个属性并自动更新另一个。 OneToMany关系的情况下,可以使用add(entity)函数很好地处理。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM