我从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>();
答案 0 :(得分:1)
JPA Transient注释与瞬态Hibernate实体概念无关。后者等同于JPA中的非托管实体概念。所以错误告诉你,在你的Project实体bean中有另一个bean在刷新发生之前没有被持久化。可能您必须向其中一个Project实体bean属性(未注释的Transient)添加级联属性。我现在看到了编辑,所以添加:
@OneToMany(cascade=CascadeType.ALL)
List<Task> tasks = new ArrayList<Task>();