2013-08-25 1 views
0

Я создаю объект JPA с отношениями ManyToOne. Почему имея child.setParent(parent); вызвать следующие проваливаются в flush():Почему установка ManyToOne родителя на ранней стадии приводит к сбою?

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

ответ

1

Я считаю, что ваш MapsId должен быть @MapsId("parentId") на основе представленной вами структуры классов. Значение MapsId является атрибутом, а не именем столбца.