Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
мой код, который работает 
Код

class Article ....

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="FK_TEXT_ID")
    public ArticleText getText() {
        return text;
    }


в ArticleText  никаких @OneToOne нет, когда удаляю Article , то удаляется и ArticleText

Добавлено @ 11:30
вообще могу посоветовать видеоуроки по технологиям java на youtube, по хибернейту вообще отличные, всегда у меня под рукой http://www.youtube.com/user/koushks

Автор: carn 21.4.2012, 11:51
Огромное спасибо!
Попробую так. 
Если что, отпишусь smile 

Автор: 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
Попробуйте добавить аннотацию
Код

@OnDelete(action = OnDeleteAction.CASCADE)

Автор: carn 21.4.2012, 15:56
Так тоже не работает smile 
 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Authorizations auth;

Жесть!
Всё равно, я Вам очень благодарен за помощь!
Буду дальше пытаться, это часть моего диплома  smile 

Автор: Stolzen 21.4.2012, 16:00
Ну сделайте удаление двумя запросами вместо одного

Автор: carn 21.4.2012, 16:03
Если не получиться с каскадным удалением, то придется так..

Автор: Старовъръ 21.4.2012, 18:33
Цитата
В другой сущности у меня следующее
    @OneToOne(cascade = CascadeType.ALL)
    private Teacher teacher;

Ты же удаляешь не основной объект, в таком случае откуда ему знать, что нужно каскадно удалять внешний? В этом куске ты говоришь что при удалении главного объекта, нужно удалять и дочерний, а ты делаешь наоборот.

Автор: carn 22.4.2012, 12:19
Да я просто уже переделал два раза )
Раньше  у меня связывающее поле было в таблице authorizations, а стало в teacher. 

    @OneToOne(cascade = CascadeType.ALL)
    private Teacher teacher;

этого у меня теперь нет )
Я сделал удаление двумя запросами. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)