Hibernate给我一个错误,因为一个对象引用了一个未保存的瞬态实例 - 但是我希望它在DB中保持未保存状态

时间:2015-09-18 22:28:06

标签: java hibernate

我从Hibernate收到以下错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.avtain.primavera.data.Project

在项目类中,我有以下属性:

@Transient
private Map<String,Task> taskIndex = new HashMap<String,Task>();

这张地图只是作为一个有用的索引,它没有任何数据也不在ArrayList中,也包含相同的数据。我使用以下方法更新了taskIndex

public void setTasks(List<Task> tasks) {
    taskIndex.clear();
    for(Task task : tasks)
        addTask(task);
}

public void addTask(Task task) {
    this.tasks.add(task);
    taskIndex.put(task.getTaskId(), task);
}

正如您所看到的,没有理由taskIndex应保存在数据库中,一旦Hibernate使用我的setter方法构建Project对象,就应该更新它。我不确定为什么Hibernate会给我这个错误。

编辑:这是实际应该保留的列表:

@OneToMany
List<Task> tasks = new ArrayList<Task>();

1 个答案:

答案 0 :(得分:1)

JPA Transient注释与瞬态Hibernate实体概念无关。后者等同于JPA中的非托管实体概念。所以错误告诉你,在你的Project实体bean中有另一个bean在刷新发生之前没有被持久化。可能您必须向其中一个Project实体bean属性(未注释的Transient)添加级联属性。我现在看到了编辑,所以添加:

@OneToMany(cascade=CascadeType.ALL)
List<Task> tasks = new ArrayList<Task>();
相关问题