JPA:@ManyToOne没有自动更新引用

时间:2013-07-01 03:03:50

标签: java unit-testing jpa playframework

我有两个实体OrgTypeOrgField

@Entity(name = "T_ORG_FIELD")
public class OrgField extends Model {
    @MinSize(value = 2)
    @Column(nullable = false)
    public String name;

    @ManyToOne
    public OrgType orgType;
    ...
}

@Entity(name = "T_ORG_TYPE")
public class OrgType extends Model {
    @Column(nullable = false, unique = true)
    public String name;

    @OneToMany(mappedBy = "orgType")
    public List<OrgField> orgFields = new ArrayList<OrgField>();
    ...
}

现在,我正在为他们编写单元测试:

public class OrganizationTest extends UnitTest {

    @Test
    public void saveOrRemoveOrg() {
        OrgType orgType = new OrgType("org type", "description");
        orgType.save();

        OrgField field = new OrgField();
        field.name = "field1";
        field.orgType = orgType;
        field.save();

        Model.em().flush();

        System.out.println(OrgField.count("name = ?", "field1")); // Output : 1

        int size = orgType.orgFields.size();
        assertEquals(1, size);   // Error , expect 1 but get 0.
        ...

我创建了一个新的OrgField并更新了它的orgType引用,并且预计会自动填充orgType.orgFields,但它没有。

任何帮助?

1 个答案:

答案 0 :(得分:0)

尝试填写 fetch 属性,如下所示:

@ManyToOne(fetch=FetchType.EAGER)

@OneToMany(mappedBy="orgType", fetch = FetchType.EAGER)

FecthType.EAGER 会根据需要获取它。如果愿意,您可以为每个类定义不同的值。相反,您可以 FetchType.LAZY ,明确设置此属性而不是保留要使用的默认值是一个很好的实践。

此外,您可以使用级联属性与 CascadeType.ALL 自动保留等,或者检查CascadeType枚举以查看其他值。明确定义级联属性的值也是一种很好的做法。