注意孩子的實體:不能刪除具有收藏與休眠
這是一個croass後:hibernate forum
因爲我沒有答案,所以我在這裏問,看看我是否能得到一些幫幫我。 :)
如果這是在這裏解決,我會發布在休眠論壇的答案。 :)
在我的應用程序中,我有一些實體擁有一些集合,當我不知道刪除它們。
這是我eneity的核心代碼:
代碼:
@Entity
@Table(
name = "t_task")
public class Task {
private int id;
private List<TaskStep> steps = new ArrayList<TaskStep>();
public Task() {
this.createTime = new Date();
}
public Task(String name) {
this();
this.name = name;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
@OneToMany(
cascade = CascadeType.ALL)
@JoinColumn(
name = "task_id",
nullable = false)
@LazyCollection(LazyCollectionOption.FALSE)
@IndexColumn(
name = "position")
public List<TaskStep> getSteps() {
return steps;
}
// domain method
public void addSteps(TaskStep ts) {
steps.add(ts);
ts.setTask(this);
}
public void removeStep(TaskStep ts) {
steps.remove(ts);
}
// setter
public void setId(int id) {
this.id = id;
}
public void setSteps(List<TaskStep> steps) {
this.steps = steps;
for (TaskStep st : steps) {
st.setTask(this);
}
}
}
//TaskStep:
@Entity
@Table(
name = "t_taskstep")
public class TaskStep {
private int id;
private List<Operator> operator = new ArrayList<Operator>();
private Task task;
public TaskStep() {}
@Id
@GeneratedValue
public int getId() {
return id;
}
@ManyToMany(
cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
public List<Operator> getOperator() {
return operator;
}
@ManyToOne
@JoinColumn(
name = "task_id",
nullable = false,
updatable = false,
insertable = false)
public Task getTask() {
return task;
}
// domain method start
public void addOperator(Operator op) {
operator.add(op);
}
// setter
public void setId(int id) {
this.id = id;
}
public void setOperator(List<Operator> operator) {
this.operator = operator;
}
public void setTask(Task task) {
this.task = task;
}
}
//Operator:
@Entity
@Table(
name = "t_operator")
public class Operator {
private int id;
private List<TaskStep> steps = new ArrayList<TaskStep>();
public Operator() {}
@Id
@GeneratedValue
public int getId() {
return id;
}
// //setter
public void setId(int id) {
this.id = id;
}
public void setSteps(List<TaskStep> steps) {
this.steps = steps;
}
@ManyToMany(
mappedBy = "operator")
public List<TaskStep> getSteps() {
return steps;
}
}
在db,有 「t_task」, 「t_operator」, 「t_step」, 「t_step_operator」 的表格。
我使用這種方式刪除任務: 代碼: taskDao.delTaskById(5);
這是道:
代碼:
public void delTaskById(int id) {
Task t = queryTaskById(id);
Session sess = factory.getCurrentSession();
try {
sess.beginTransaction();
sess.delete(t); // 1)
sess.flush();
sess.getTransaction().commit();
} catch (HibernateException e) {
sess.getTransaction().rollback();
}
}
我得到了一個錯誤,說:「不能刪除或更新父行......」。
然後我試圖使用repalce的
sess.delete(t)
到
sess.createQuery("delete from Task t where t.id="+id).executeUpdate()
我現在得到的錯誤,但任務沒有實際刪除。
我已經在映射中設置了級聯。例如,對於任務對象中的任務測試,我設置了cascade.type = all,所以我認爲當hibernate嘗試刪除任務時,它應該刪除其實現的任務步驟,並且當它嘗試刪除任務步驟對象時,它會發現「t_step_t_operator」表引用了「t_step」中的id,因此我還爲任務類中的「step」字段設置了「cascade = all」。 但似乎發生了什麼事情並不是我認爲的......
問題是什麼?我瘋了!
任何人都可以幫我一個忙嗎?
BWT,級聯是什麼意思?
例如: 在TaskStep calss中,我有一個操作符列表;
//Class:TaskStep.
@ManyToMany(
cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
public List<Operator> getOperator() {
return operator;
}
在上述〔實施例,我設置級聯= ALL,這是否意味着無論什麼操作(豆腐)的TaskStep,它會做同樣的操作來Opeartors?
我測試過了,如果我只在映射中使用mappedBy,那麼位置就不會被設置,所以我必須定義兩次「joinColumn」,看看這個:http://opensource.atlassian.com/projects/hibernate/browse/HHH-4390。順便說一句,從你的回答中,我對雙向關係和雙向引用感到困惑。在我的例子中,task和tasktep都是引用另一個,這是雙向引用,但是在這種訴訟中什麼是關係?bi或un? – hguser 2011-03-30 01:14:15