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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по JPA 
:(
    Опции темы
Billik
  Дата 16.2.2011, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет,

У меня вопрос. Создал 2 класса, которые автоматически генерят 2 Таблицы. Authority имеет foreign key на username. С помощью кода, который я приведу ниже у меня все работает (создание, удаление и редактирование), кроме редактирования поля username. 
Кидается ошибка:
Цитата
The UPDATE statement conflicted with the REFERENCE constraint "FKCF662723EB47913C". The conflict occurred in database "logging", table "dbo.Authority", column 'username'.


Ошибка понятна ибо у foreign key нет ON UPDATE CASCADE. Если я руками добаляю это в базе, тогда username редактировать можно.

Вопрос в следующем: Как с помощью JPA добавить ON UPDATE CASCADE для foreign key?

Пожалуйста, приведите пример. Ибо перепробовал @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE), @Cascade(org.hibernate.annotations.CascadeType.MERGE) и @Cascade(org.hibernate.annotations.CascadeType.PERSIST) не палит или я что-то не так делаю. 

Вот мои два класса.

Код

package com.planprescriber.sitetracker.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "[User]")
public class User implements Serializable {
    private static final long serialVersionUID = -5265566238672665058L;

    private Long id;
    private String username;
    private List<Authority> assignedRoles;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(unique = true, nullable=false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    public List<Authority> getAssignedRoles() {
        return assignedRoles;
    }

    public void setAssignedRoles(List<Authority> assignedRoles) {
        this.assignedRoles = assignedRoles;
    }

}



Код

@Entity
public class Authority {
    protected Long id;
    protected User user;
    protected String authority;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "username", referencedColumnName="username", nullable = false)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getAuthority() {
        return authority;
    }

    public void setAuthority(String authority) {
        this.authority = authority;
    }
}


Огромное спасибо
PM MAIL   Вверх
LSD
Дата 17.2.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Я так понимаю, что Authority это подчиненная сущность и отдельно от User она не существует, так?

Если да, то поставь у Authority
Код

@ManyToOne(cascade = {})

у User
Код

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)

добавь методы addAuthority() и removeAuthority() которые будут корректно проставлять взаимные ссылки в обоих классах. И вызывай persist() для обоих сущностей.

P.S. Если проблема останется, то включи логгирование SQL запросов у Hibernate (я так понимаю, ты именно его используешь).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
XoJIoD
Дата 17.2.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Billik, а не пробавал ли ты перенести Foreign Key  с поля username на поле id для класса User? и еще наверно надо в этих классах переопределить equals и hashCode. А лудше написат Layer Supertype с этими методами.
PM MAIL   Вверх
Billik
Дата 17.2.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



XoJIoD,
Цитата

Billik, а не пробавал ли ты перенести Foreign Key  с поля username на поле id для класса User?

Нельзя. Условие такое.

LSD,
Увы такого orphanRemoval = true нет в аннотации @OneToMany. Пытался добавить @OnDelete(action = OnDeleteAction.CASCADE), но это тоже не помогло.

Нужно просто добавить ON UPDATE CASCADE в foreign key, только как это сделать средствами JPA я не знаю :(

Спасибо за помощь.
PM MAIL   Вверх
LSD
Дата 18.2.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Billik @  17.2.2011,  20:54 Найти цитируемый пост)
Увы такого orphanRemoval = true нет в аннотации @OneToMany.

Есть, но в версии 2.0.


Цитата(Billik @  17.2.2011,  20:54 Найти цитируемый пост)
Нужно просто добавить ON UPDATE CASCADE в foreign key, только как это сделать средствами JPA я не знаю :(

Нет не нужно. Если какие-то изменения в базе будут проводится, минуя Hibernate (каскады, тригеры и т.п.). То Hibernate о них не узнает и могут быть проблемы с закешированными данными.

А вообще включи логгирование SQL и параметров. Что он пытается прописать, что вызывается такая странная ошибка. Судя по ошибке, он пытается записать в username значение, которого нет в родительской таблице.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Billik
Дата 18.2.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



LSD,
Сначала в логах пишется 
Цитата

Hibernate: update [User] set enabled=?, firstName=?, lastName=?, password=?, username=? where id=?

Потом валится ошибка.

А вот если прописать ON UPDATE CASCADE в foreign key, тогда все сохраняется хорошо. И порядок сохранения такой:
Цитата

Hibernate: update [User] set enabled=?, firstName=?, lastName=?, password=?, username=? where id=?
Hibernate: update Authority set authority=?, username=? where id=?
Hibernate: update Authority set authority=?, username=? where id=?

PM MAIL   Вверх
LSD
Дата 21.2.2011, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



А какие параметры для этих запросов? (org.hibernate.type на уровне TRACE).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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