0

ManyToOne関係を持つ JPA エンティティを作成しています。child.setParent(parent);中に次のエラーが発生するのはなぜですかflush():

org.apache.openjpa.persistence.ArgumentException: Missing field for property "parent_id" in type "class test.ChildPrimaryKey".

失敗するテスト コード:

    Parent parent = new Parent();
    Child child = new Child();
    ChildPrimaryKey childPrimaryKey = new ChildPrimaryKey();
    childPrimaryKey.setLookupId(1);
    child.setId(childPrimaryKey);
    child.setParent(parent); // <-- FAIL because of this

    // Begin transaction
    entityManager.clear();
    entityManager.getTransaction().begin();

    LOGGER.info("Persisting parent without child.");
    entityManager.persist(parent);

    LOGGER.info("Updating parent with child.");
    childPrimaryKey.setParentId(parent.getId());
    parent.getChildren().add(child);
    entityManager.merge(parent);

    // Fail happens at flush
    entityManager.flush();

エンティティ:

@Embeddable
public class ChildPrimaryKey {
    @Column(name = "lookup_id")
    private int lookupId;

    @Column(name = "parent_id")
    private long parentId;
}

@Entity
@Table(name = "child")
public class Child {

    @EmbeddedId
    private ChildPrimaryKey id;

    @MapsId("parent_id")
    @ManyToOne
    private Parent parent;
}

@Entity
@Table(name = "parent")
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Child> children;
}

child.setParent(parent);ステートメントを削除すると、私のコードはパスします。OpenJPA 2.2.2 の使用

4

1 に答える 1

1

あなたが提示したクラス構造に基づいているMapsIdべきだと思います。@MapsId("parentId")の値MapsIdは属性であり、列名ではありません。

于 2013-08-25T21:14:18.147 に答える