| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Mysql + hibernate |
| Автор: carn 21.4.2012, 10:58 |
| Всем привет! У меня есть таблица Teacher; Хочу удалить строку; Добавлено через 3 минуты и 45 секунд @Transactional public void deleteTeacher(Teacher teacher) { tmpl.delete(teacher); tmpl.flush(); } Вызываю этот метод. Вылетает ошибка: Could not execute JDBC batch update; SQL [delete from Teacher where idTeacher=?]; constraint [null]; Причем idTeacher в передаваемом объекте указан! Помогите, пожалуйста! :'( |
| Автор: danilych 21.4.2012, 11:12 |
| Судя по ошибке constraint [null]; - ваш idTeacher является внешним ключом в другой таблице. Попробуйте проверить это выполнив запрос в базе: delete from <таблица учителей> where <имя id в таблице> = ? если не удалится, то 100% проблема во внешнем ключе. |
| Автор: carn 21.4.2012, 11:16 |
| Спасибо за ответ! Да, действительно, это внешний ключ в другой таблице. Вообще мне надо чтоб и из другой таблице все строки с этим айди поудалялись. В другой сущности у меня следующее @OneToOne(cascade = CascadeType.ALL) private Teacher teacher; по идее должно произойти каскадное удаление... Не понимаю, почему не работает. |
| Автор: danilych 21.4.2012, 11:25 | ||
мой код, который работает
в ArticleText никаких @OneToOne нет, когда удаляю Article , то удаляется и ArticleText Добавлено @ 11:30 вообще могу посоветовать видеоуроки по технологиям java на youtube, по хибернейту вообще отличные, всегда у меня под рукой http://www.youtube.com/user/koushks |
| Автор: carn 21.4.2012, 11:51 |
| Огромное спасибо! Попробую так. Если что, отпишусь |
| Автор: carn 21.4.2012, 12:14 |
| Сделал так как Вы посоветовали. public class Teacher implements Serializable { ... @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) private Authorizations auth; ... } Теперь ошибки нет, и удаление препода происходит. Но соответсвующий аккаунт всё равно не удаляется, блин. Загружаю в сообщение скриншот sql, можете посмотреть, если желаете. |
| Автор: danilych 21.4.2012, 12:25 |
| как вы БД формировали? Вручную или с помощью hibernate? Если с помощью hibernate, то удалите схему и создайте заново, hibernate не умеет обновлять схему, он только добавляет новое. и добавьте @JoinColumn(name="FK_TEXT_ID") - это поле добавится в вашей родительской таблице и по значению в этом поле будут удаляться ваш аккаунт |
| Автор: carn 21.4.2012, 12:39 |
| БД генерировал с помощью hibernate. После внесения изменений в структуру БД, я меняю в hibernate.cfg <property name="hbm2ddl.auto">update</property> на <property name="hbm2ddl.auto">create</property> Это пересоздаёт базу. Далее возвращаю <property name="hbm2ddl.auto">update</property> Вот... Добавлено через 6 минут и 4 секунды хм.. насчёт @JoinColumn(name="FK_TEXT_ID") не очень понял. У меня в родительской таблице есть поле auth_idAuthorization. |
| Автор: Stolzen 21.4.2012, 14:58 | ||
Попробуйте добавить аннотацию
|
| Автор: carn 21.4.2012, 15:56 |
| Так тоже не работает @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @OnDelete(action = OnDeleteAction.CASCADE) private Authorizations auth; Жесть! Всё равно, я Вам очень благодарен за помощь! Буду дальше пытаться, это часть моего диплома |
| Автор: Stolzen 21.4.2012, 16:00 |
| Ну сделайте удаление двумя запросами вместо одного |
| Автор: carn 21.4.2012, 16:03 |
| Если не получиться с каскадным удалением, то придется так.. |
| Автор: Старовъръ 21.4.2012, 18:33 | ||
Ты же удаляешь не основной объект, в таком случае откуда ему знать, что нужно каскадно удалять внешний? В этом куске ты говоришь что при удалении главного объекта, нужно удалять и дочерний, а ты делаешь наоборот. |
| Автор: carn 22.4.2012, 12:19 |
| Да я просто уже переделал два раза ) Раньше у меня связывающее поле было в таблице authorizations, а стало в teacher. @OneToOne(cascade = CascadeType.ALL) private Teacher teacher; этого у меня теперь нет ) Я сделал удаление двумя запросами. |