Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 更新@OneToMany集合时出现问题_Hibernate_Jpa_Jpa 2.0_Hibernate Mapping_Hibernate Onetomany - Fatal编程技术网

Hibernate 更新@OneToMany集合时出现问题

Hibernate 更新@OneToMany集合时出现问题,hibernate,jpa,jpa-2.0,hibernate-mapping,hibernate-onetomany,Hibernate,Jpa,Jpa 2.0,Hibernate Mapping,Hibernate Onetomany,我正试图更新@OneToMany映射,这让我陷入了困境 问题: 我有两个实体:标准和任务。条件可以包含多个任务 class Criteria { @OneToMany(mappedBy = "criteria", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY) @Cascade({ org.hibernate.annotat

我正试图更新@OneToMany映射,这让我陷入了困境

问题: 我有两个实体:标准和任务。条件可以包含多个任务

class Criteria {
    @OneToMany(mappedBy = "criteria", cascade = { CascadeType.PERSIST,
    CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
    @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE,
               org.hibernate.annotations.CascadeType.ALL,
               org.hibernate.annotations.CascadeType.MERGE,
               org.hibernate.annotations.CascadeType.PERSIST })
     private Set<Task> tasks;
}

class Task {
    @ManyToOne
    @JoinColumn(name = "CRITERIA_ID", nullable=false)
    private Criteria criteria;
}
引发此异常是因为它未删除现有任务

如果我只删除所有任务,它将完美工作,并使用以下代码删除给定条件下的所有任务:

criteriaDao.persist(criteria);
Set<Task> existingTasks=criteria.getTasks();
if(existingTasks != null) {
    for (Task task : existingTasks) {
    task.setCriteria(null);
}
}
criteriaDao.persist(标准);
设置existingTasks=criteria.getTasks();
if(existingTasks!=null){
对于(任务:现有任务){
task.setCriteria(null);
}
}
在添加新任务和更多内容后,我尝试了所有使用合并的选项,但似乎没有任何效果。我被困在这里,肯定错过了Hibernate中一些非常基本的东西


提前谢谢

在你的
任务
课程中,你不应该参考
标准
。只需将其连同注释一起删除即可

然后,不要设置任务所引用的
标准
,因为该引用不再存在,只需使用
标准。设置任务(newTasks)
并保存
标准


让我解释一下。
标准
任务
之间的关系显然是
标准1--n个任务
-1到n。现在,您可以调用
one-to-many
关系,也可以调用
many-to-one
,这取决于您的观点。从
标准
的角度看,它是
一对多
,而从
任务
的角度看,它是
多对一
。一般来说,从这些观点中选择一个并坚持下去是明智和更直观的。选择一个观点,定义“控制”关系的实体,任何修改都应该应用于该关系


在您的情况下,如果您认为
标准
包含拥有一组
任务
,那么您应该将该关系视为
一对多
。在决定了这一点之后,在
任务
的java类
中不需要
标准
引用。您仅通过
标准
API(为数据库中的
任务
创建的表确实有一列引用其包含的
标准
)来控制关系。

Hmm…我认为多对一应该与一对多一起工作,我没有看到任何问题。JPA还支持反向映射。我通过在使用新的set collection-for(Task-Task:existingTasks){Task.setCriteria(null);}=>session.flush()设置集合之前添加以下行来修复此问题;标准。设置任务(任务);这可以确保delete语句在插入之前执行。@RakeshSinha很高兴您解决了这个问题。但是,我建议您阅读这篇文章,它解释了如何在一对多关系中使用
。谢谢,我以前看过这篇文章,也使用过同样的方法。你认为还有别的方法可以实现我所做的吗。?显式调用flush()可以工作,但这会导致实体管理器将所有查询刷新到数据库。是否有更好的方法更新集合。?
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (CCA_DEV_5.TASK__UN) violated
criteriaDao.persist(criteria);
Set<Task> existingTasks=criteria.getTasks();
if(existingTasks != null) {
    for (Task task : existingTasks) {
    task.setCriteria(null);
}
}