Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Hibernate @ManyToMany Cascade 
:(
    Опции темы
Lonkly
Дата 3.9.2010, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Доброго времени суток, товарищи =) Помогите разрешить проблему с Hibernate?) Или со структурой так сказать...?



Есть сущность User, у которой есть таблица, содержащая сущность User_Friends, в которой 2 ссылки на пользователя. 

Код

@ManyToMany(cascade = CascadeType.ALL, targetEntity = UserFriends.class)
    private Set<UserFriends> friends = new HashSet<UserFriends>();


Код

@Entity
@Table(name = "USER_FRIENDS")
public class UserFriends implements Serializable {

    private static final long serialVersionUID = -8267560794720819507L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "USER_FRIENDS_ID", nullable = true)
    private Long id;

    @ManyToOne()
    @JoinColumn(name = "USER_ID1", referencedColumnName = "USER_ID")
    private User user1;

    @ManyToOne()
    @JoinColumn(name = "USER_ID2", referencedColumnName = "USER_ID")
    private User user2;


Удаляю пользователя из друзей таким образом. 
Код

    @SuppressWarnings("unchecked")
    @Override
    public void removeFriend(User user, Long friendId) throws Exception {
        Long userId = user.getId();
        List<UserFriends> resultList = hibernateTemplate
                .find("from UserFriends as friends where friends.user1.id='"
                        + userId + "' or friends.user2.id='" + userId
                        + "' and friends.user2.id='" + friendId
                        + "' or friends.user1.id='" + friendId + "'");
        if (!resultList.isEmpty()) {
            hibernateTemplate.delete(resultList.get(0));

        } else
            throw new Exception();
    }


Проблема: когда удаляю пользователя, он не удаляется.  Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`socio`.`user_user_friends`, CONSTRAINT `FKBBEEACF5CB72EE3F` FOREIGN KEY (`friends_USER_FRIENDS_ID`) REFERENCES `user_friends` (`USER_FRIENDS_ID`))

А если ставлю так

Код

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "USER_ID1", referencedColumnName = "USER_ID")
    private User user1;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "USER_ID2", referencedColumnName = "USER_ID")
    private User user2;

то удаляется сразу все включая самих пользователей.


Суть вопроса: что нужно сделать, чтобы чтобы удалялась только UserFriends сущность? Или как лучше сконфигурировать друзей пользователя?

Это сообщение отредактировал(а) Lonkly - 5.9.2010, 00:35
PM MAIL ICQ   Вверх
Zыыыыы
Дата 4.9.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.2.2010

Репутация: нет
Всего: нет



В таблице для сущности User, наверняка есть колонка типа User_Friends_id, содержащая id из таблицы User_Friends. Если это так, то стоит проверить, не стоит ли на колонке User_Friends_id ограничение not null. Если оно есть, то без удаления юзеров хибернейт не позволит удалить запись в таблице   User_Friends, т.к. это нарушит ограничение. Ну и как выход, снять это ограничение.
P.S. если со структурой таблиц ошибся, то опиши ее немного подробнее.
PM   Вверх
wedens
Дата 4.9.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



я бы сделал в классе пользователся список друзей со связью many-to-many
PM MAIL   Вверх
Lonkly
Дата 4.9.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Цитата(wedens @  4.9.2010,  14:57 Найти цитируемый пост)
я бы сделал в классе пользователся список друзей со связью many-to-many 


О ну это очевидно, вот только потом с удалением и добавлением пользователя в друзья будет борода.



Цитата(Zыыыыы @  4.9.2010,  13:59 Найти цитируемый пост)
В таблице для сущности User, наверняка есть колонка типа User_Friends_id, содержащая id из таблицы User_Friends. Если это так, то стоит проверить, не стоит ли на колонке User_Friends_id ограничение not null. Если оно есть, то без удаления юзеров хибернейт не позволит удалить запись в таблице   User_Friends, т.к. это нарушит ограничение. Ну и как выход, снять это ограничение.


Спасибо, вот это сейчас и проверим...
PM MAIL ICQ   Вверх
Lonkly
Дата 5.9.2010, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Не выходит. Получаю вот что...


Код

Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`socio`.`user_user_friends`, CONSTRAINT `FKBBEEACF5CB72EE3F` FOREIGN KEY (`friends_USER_FRIENDS_ID`) REFERENCES `user_friends` (`USER_FRIENDS_ID`)


Это сообщение отредактировал(а) Lonkly - 5.9.2010, 01:36
PM MAIL ICQ   Вверх
wedens
Дата 5.9.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



у вас вобще бред полный, потому ничего и не работает, если с одной стороны ManyToMany  то и с другйо должно быть ManyToMany. сделайте просто в классе пользователся(ну он у вас итак есть) список друзей того же класса, не делая какой-то UserFriends с бредовыми полями и еще более бредовыми маппингами
PM MAIL   Вверх
Zыыыыы
Дата 5.9.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.2.2010

Репутация: нет
Всего: нет



Раз мой способ не помог, то возможно стоит действительно пересмотреть сруктуру классов. Если у одного юзера может быть несколько друзей, то можно сделать следующую структуру:
Таблица Users(id и поля по усмотрению), таблица Friends с полями id записи, id юзера, id юзера-друга. Уникальным будет только первое. Получится немного вырожденный вариант ManyToMany. Ну и, как написал wedens, сделать в классе User коллекцию друзей-юзеров.
Кстати важно не забыть поставить атрибут invers="true" у связи ManyToMany, так можно будет удалять друзей юзера напрямую из коллекции юзера, а потом делать его апдейт. Поле таких манипуляций таблица Users не должна измениться, а в Friends удаляться соответствующие записи.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.