0

私は2つのエンティティを持っていOrgTypeますOrgField:

@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。自動的に入力されるはずでしたが、そうではありませんでした。

助けはありますか?

4

1 に答える 1

0

以下のようにフェッチ属性を入力してみてください。

@ManyToOne(fetch=FetchType.EAGER)

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

FecthType.EAGERは、必要に応じて取得します。必要に応じて、クラスごとに異なる値を定義できます。代わりに、FetchType.LAZYを使用できます。デフォルト値をそのまま使用するのではなく、この属性を明示的に設定することをお勧めします。

さらに、 CascadeType.ALLで属性cascadeを使用して自動的に永続化することも、CascadeType enum をチェックして他の値を確認することもできます。また、カスケード属性の値を明示的に定義することもお勧めします。

于 2013-07-01T05:07:16.110 に答える