持久化 JPA 集合 oneToMany 不起作用



我有这个自我关系注释

public class Estoria implements Serializable {
 @EmbeddedId 
 protected EstoriaPK estoriaPK; 
@ManyToOne
@JoinColumns({@JoinColumn(name = "id_estoria", referencedColumnName = "id", updatable = false, insertable = false, nullable = true)
          ,@JoinColumn(name = "id_projeto" , referencedColumnName = "id_projeto" ,     insertable = false, updatable = false)})
private Estoria subtask;
@OneToMany(mappedBy = "subtask",cascade = CascadeType.ALL) 
private Collection<Estoria> subtasks; 
}

我尝试保留此集合::

public void persistSubtasks(int idEstoria, Collection<Estoria> subtasks) {
    Estoria rootEstoria = entityManager.createNamedQuery("Estoria.findById", Estoria.class)
                    .setParameter("id", idEstoria)
                    .getSingleResult();
        rootEstoria.setSubtasks(subtasks);
}

但是数据库持久性没有保留根引用 ID:

+----+------------+------------+--------------------------+-----------     -------------------------------------------------------------------+------   ------+--------+--------------+
| id | id_projeto | id_estoria | nome                     | descricao                                                                      | estimativa | status | data_criacao |
+----+------------+------------+--------------------------+------------------------------------------------------------------------------+------------+--------+--------------+
|  1 |          7 |       NULL | Check all old activities | No one know if every feature was checked before builded                      |       NULL |      0 | 2015-01-02   |
|  2 |          7 |       "supost to be 1" | Register all users       | Everyone needs to be registered and identified by profile                    |       NULL |      0 | 2015-01-02   |

谁能给我一些礼物?

好消息这篇文章>理解注释和 JPA(休眠)解决了我的问题,但我真的不需要参考根>>叶/叶>>根

您必须在子 ID 中设置 parrent id。在子任务集合中设置 rootEstoria id。

public void persistSubtasks(int idEstoria, Collection<Estoria> subtasks) {
    Estoria rootEstoria = entityManager.createNamedQuery("Estoria.findById", Estoria.class)
                .setParameter("id", idEstoria)
                .getSingleResult();
    for(Estoria subtask:subtasks){
        subtask.setSubtask(rootEstoria);
    }
    rootEstoria.setSubtasks(subtasks);
}

最新更新