Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Java и базы данных

Войти
Регистрация
Восстановить пароль
 
_SH_
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 9
#1

PostgreSQL PostgresSQL + Hibernate (many-to-many, annotation) - операция delete - Java БД

27.12.2016, 01:26. Просмотров 330. Ответов 3
Метки нет (Все метки)

всем привет! все переискал, перепробовал различные виды каскадов, но безрезультатно. не могу корректно удалить entity.
классическая история: у developer много skills, у skill, может быть много девелоперов - many-to-many (annotation).
использую в developerEntity:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "dev_ski",
joinColumns = {@JoinColumn(name = "dev_id") },
inverseJoinColumns = { @JoinColumn(name = "ski_id") })
использую в skillEntity:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "dev_ski",
joinColumns = {@JoinColumn(name = "ski_id") },
inverseJoinColumns = { @JoinColumn(name = "dev_id") })

Итог:
Initial list of developers:
Developer{developerId=10, developerName='Petr', skillsSet=[Skill{skillId=2, skillName='JavaScript'}, Skill{skillId=1, skillName='Java'}]}
Developer{developerId=11, developerName='Andrey', skillsSet=[Skill{skillId=2, skillName='JavaScript'}, Skill{skillId=3, skillName='C++'}]}
Developer{developerId=12, developerName='Mariya', skillsSet=[Skill{skillId=3, skillName='C++'}, Skill{skillId=4, skillName='Scala'}]}

Delete Andrey
DEVELOPER - 11 WAS DELETED

Final list of developers:
Developer{developerId=10, developerName='Petr', skillsSet=[Skill{skillId=1, skillName='Java'}]}
Developer{developerId=12, developerName='Mariya', skillsSet=[Skill{skillId=4, skillName='Scala'}]}


Process finished with exit code 0

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

у кого-нибудь получалось совершить корректно delete в подобной ситуации? какую-комбинацию каскада использовали?
спасибо!

Добавлено через 57 минут
добавлю. если в DeveloperEntity изменить каскад на:
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST}, targetEntity = Skill.class)
@JoinTable(name = "dev_ski_m_to_m",
joinColumns = {@JoinColumn(name = "dev_id") },
inverseJoinColumns = { @JoinColumn(name = "ski_id") })

то удаление проходит корректно:
Delete Andrey
DEVELOPER - 11 WAS DELETED

Final list of developers:
Developer{developerId=10, developerName='Petr', skillsSet=[Skill{skillId=1, skillName='Java'}, Skill{skillId=2, skillName='JavaScript'}]}
Developer{developerId=12, developerName='Mariya Zotova', skillsSet=[Skill{skillId=3, skillName='C++'}, Skill{skillId=4, skillName='Scala'}]}

Process finished with exit code 0

но тут сразу другая проблема - я теперь не могу создавать новых developer)
WARN: SQL Error: 0, SQLState: 23503
дек 27, 2016 12:23:21 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ERROR: insert or update on table "dev_ski" violates foreign key constraint "ski_id_fk"
Подробности: Key (ski_id)=(1) is not present in table "skills".
Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "dev_ski" violates foreign key constraint "ski_id_fk"
Подробности: Key (ski_id)=(1) is not present in table "skills".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2016, 01:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос PostgreSQL PostgresSQL + Hibernate (many-to-many, annotation) - операция delete (Java БД):

Почему операция DELETE FROM... работает только в GUI, а не в консольном варианте - Java БД
Если запустить приложнение как консольное и выполнить операцию DELETE к БД через jdbc, то почему то само удаление не происходит. Остальные...

Hibernate Annotation - Java EE
Помогите связать таблицы : билеты на самолет, билеты на поезд, пассажир, купленные билеты. какие связи использовать (OneToMany, ManyToMany)?

Hibernate DELETE - MySQL
Товарищи! Не могу выполнить запрос DELETE в Java. Перерыл кучу сайтов и форумов. Пишут, что все легко все просто. Скидываю в код их код и...

Операция ON DELETE - PostgreSQL
Добрый день мне нужна ваша помощь в создании БД "Автосалон", хотя по сути конкретно тема не нужна тут. проблема в том что у меня...

Операция delete в векторе - C++
Привет, друзья, делаю маленькую игрушку, там у меня постоянно появляются и уничтожаются новые объекты, и я заметил такую вещь: со временем...

Недопустимая операция при выполнении оператора delete[] - C++
Проблема у меня такая. Есть функция. Кусок ее кода выглядит примерно так: //... получам M и N float *pArr1 = new float ; int *pArr2 =...

3
LeX
292 / 292 / 79
Регистрация: 30.06.2010
Сообщений: 1,079
27.12.2016, 15:44 #2
покажи сами сущности, как заполняешь и как сохраняешь
0
_SH_
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 9
27.12.2016, 17:55  [ТС] #3
остановился пока на этом:
Java
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
@Entity
@Table(name = "developers", schema = "many_to_many", catalog = "test")
public class Developer {
    @Id
    @Column(name = "developer_id")
    private int developerId;
    @Basic
    @Column(name = "developer_name")
    private String developerName;
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "dev_ski",
            joinColumns = {@JoinColumn(name = "dev_id") },
            inverseJoinColumns = { @JoinColumn(name = "ski_id") })
    private Set<Skill> skillsSet;
    public Developer() {}
 
@Entity
@Table(name = "skills", schema = "many_to_many", catalog = "test")
public class Skill {
    @Id
    @Column(name = "skill_id")
    private int skillId;
    @Basic
    @Column(name = "skill_name")
    private String skillName;
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "skillsSet")
    private Set<Developer> developersSet;
    public Skill() {}
сохраняю стандартно:
Java
1
2
3
4
5
try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.save(developer);
            transaction.commit();
}
0
LeX
292 / 292 / 79
Регистрация: 30.06.2010
Сообщений: 1,079
28.12.2016, 09:49 #4
как заполняешь девелопера? особенно скилы
0
28.12.2016, 09:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2016, 09:49
Привет! Вот еще темы с ответами:

Операция delete вызывает ошибку Access violation at address - C++ Builder
Доброго времени суток, уважаемые форумчане! Компьютер HP omnibook xe4100, Mobile Intel Celeron 1.14ГГц, ОЗУ 480Мб ОС Windows XP SP2....

Hibernate Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister - Java EE
Доброго времени суток. Сталкиваюсь со всякими ошибками при добавлении данных в свою mysql бд. Вот код ошибки Exception in thread...

Установка PostgresSQL - PostgreSQL
Добрый день, Помогите пожалуйста решить проблему с установкой PostgresSQL. Запускаю файл, все в порядке до окно где спрашивает...

PostgresSql + Qt изображения - C++ Qt
Здравствуйте, помогите разобраться, как сохранять изображения в базе, читать их в проекте, и отображать; Пока только поняла чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru