Добрый день. У меня такая проблема: не могу понять, что делаю не так, перепробовал кучу разных вариантов настройки каскадного удаления данных из БД. У меня есть 3 таблицы, Person, Task, TaskLog. Person относится к Task как 1 ко многим, Task к TaskLog также 1 ко многим. Мне необходимо, что бы удаление записи из, например, Person, повлекло за собой удаление связанных с ней записей из 2х других таблиц. Запись данных и удаление с самого низа работают нормально, а вот каскадное удаление настроить не получается. При попытке удалить запись из Person, пишет "could not execute statement" Подскажите пожалуйста, что я делаю не так.
Код класса Person:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
package logic;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
//import org.hibernate.annotations.Cascade;
//import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
@Entity
@Table(name = "Person")
public class Person {
private Long id;
private String name;
private String login;
private String password;
private Set<Task> task = new HashSet<Task>(0);
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "id")
public Long getId() {
return id;
}
@Column(name = "Name")
public String getName() {
return name;
}
@Column(name = "Login")
public String getLogin() {
return login;
}
@Column(name = "Password")
public String getPassword() {
return password;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setLogin(String login) {
this.login = login;
}
public void setPassword(String password) {
this.password = password;
}
public void setTask(Set<Task> task) {
this.task = task;
}
@OneToMany(targetEntity = logic.Task.class, cascade = { CascadeType.REMOVE }, fetch = FetchType.LAZY)
@JoinColumn(name = "id")
public Set<Task> getTask() {
return task;
}
}
Код создания таблицы Person:
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE `person` (
`id` BIGINT(20) NOT NULL,
`Login` VARCHAR(255) NULL DEFAULT NULL,
`Name` VARCHAR(255) NULL DEFAULT NULL,
`Password` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='cp1251_general_ci'
ENGINE=MyISAM;
Код класса Task:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
package logic;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
@Entity
@Table(name = "Task")
public class Task {
private Long id;
private String taskName;
private String personName;
private Boolean finish;
private Person person;
private Set<TaskLog> taskLog = new HashSet<TaskLog>(0);
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "id")
public Long getId() {
return id;
}
@Column(name = "TaskName")
public String getTaskName() {
return taskName;
}
@Column(name = "PersonName")
public String getPersonName() {
return personName;
}
@Column(name = "Finish")
public Boolean getFinish() {
return finish;
}
public void setId(Long id) {
this.id = id;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
public void setFinish(Boolean finish) {
this.finish = finish;
}
public void setPerson(Person person) {
this.person = person;
}
public void setTaskLog(Set<TaskLog> taskLog) {
this.taskLog = taskLog;
}
@ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "pid")
public Person getPerson() {
return person;
}
@OneToMany(targetEntity = logic.TaskLog.class, cascade = { CascadeType.REMOVE }, fetch = FetchType.LAZY)
@JoinColumn(name = "id")
public Set<TaskLog> getTaskLog() {
return taskLog;
}
}
Код создания таблицы Task:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `task` (
`id` BIGINT(20) NOT NULL,
`Finish` BIT(1) NULL DEFAULT NULL,
`PersonName` VARCHAR(255) NULL DEFAULT NULL,
`TaskName` VARCHAR(255) NULL DEFAULT NULL,
`pid` BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `FK_5ftc8sl5jmt6a1tyrg20xyou1` (`pid`)
)
COLLATE='cp1251_general_ci'
ENGINE=MyISAM;
Код класса TaskLog:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
package logic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
@Entity
@Table(name = "TaskLog")
public class TaskLog {
private Long id;
private String taskName;
private Long time;
private String comment;
private Task task;
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "id")
public Long getId() {
return id;
}
@Column(name = "TaskName")
public String getTaskName() {
return taskName;
}
@Column(name = "Time")
public Long getTime() {
return time;
}
@Column(name = "Comment")
public String getComment() {
return comment;
}
public void setId(Long id) {
this.id = id;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public void setTime(Long time) {
this.time = time;
}
public void setComment(String comment) {
this.comment = comment;
}
public void setTask(Task task) {
this.task = task;
}
@ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "tid")
public Task getTask() {
return task;
}
}
Код создания таблицы TaskLog:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `tasklog` (
`id` BIGINT(20) NOT NULL,
`Comment` VARCHAR(255) NULL DEFAULT NULL,
`TaskName` VARCHAR(255) NULL DEFAULT NULL,
`Time` BIGINT(20) NULL DEFAULT NULL,
`tid` BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `FK_ifh70mmn6648pjxhckqblexmf` (`tid`)
)
COLLATE='cp1251_general_ci'
ENGINE=MyISAM;