JPA坚持一对一的父母子女关系

JPA坚持一对一的父母子女关系

问题描述:

我想保留20个子实体的父实体, 我的代码在下面

I want to persist parent entity with 20 child entities, my code is below

父母阶级

@OneToMany(mappedBy = "parentId")
private Collection<Child> childCollection;


儿童班


Child Class

@JoinColumn(name = "parent_id", referencedColumnName = "parent_id")
@ManyToOne(optional=false)
private Parent parent;


String jsonString = "json string containing parent properties and child  collection" 

ObjectMapper mapper = new ObjectMapper();
Parent parent = mapper.readValue(jsonString, Parent.class);

public void save(Parent parent) {
    Collection<Child> childCollection = new ArrayList<>() ;

    for(Child tha : parent.getChildCollection()) { 
        tha.setParent(parent);
        childCollection.add(tha);
    }

    parent.setChildCollection(childCollection);
    getEntityManager().persist(parent);
 }

因此,如果有20个子表,那么我必须在每个表中设置父引用,因为我必须编写20个for循环? 可行吗还有其他可以自动保留父级和子级的方式或配置吗?

So if there are 20 child tables then I have to set parent reference in each of them for that I have to write 20 for loops? Is it feasible? is there any other way or configuration where I can automatically persist parent and child?

修复父类:

@OneToMany(mappedBy = "parent")

mappedBy 属性应指向关系另一侧的字段.正如 JavaDoc 所说:

mappedBy property should point to field on other side of relationship. As JavaDoc says:

拥有关系的字段.除非关系是单向的,否则为必需.

The field that owns the relationship. Required unless the relationship is unidirectional.

此外,您还应该明确地在周期中持久保留子实体:

Also you should explicitely persist Child entity in cycle:

for(Child tha : parent.getChildCollection()) { 
    ...
    getEntityManager().persist(tha);
    ...
}

Alan Hay 在评论中注意到,您可以使用级联功能,并让EntityManager自动持久保存所有子实体:

As Alan Hay noticed in comment, you can use cascade facilities and let EntityManager automatically persist all your Child entities:

@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)

您可以在弗拉德·米哈尔西娅(Vlad Mihalcea)的博客.