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

Удаление Entity из БД - Java БД

Восстановить пароль Регистрация
 
kostrorod
38 / 27 / 5
Регистрация: 14.04.2012
Сообщений: 223
22.11.2016, 10:40     Удаление Entity из БД #1
Имеется класс User
Кликните здесь для просмотра всего текста
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
29
30
31
32
33
34
35
36
@Entity
@Table(name = "users", uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class User extends NamedEntity {
    @Column(name = "email", nullable = false, unique = true)
    @Email
    @NotEmpty
    private String email;
 
    @Column(name = "password", nullable = false)
    @NotEmpty
    @Length(min = 5)
    private String password;
 
    @Column(name = "enabled", nullable = false)
    private boolean enabled = true;
 
    @Column(name = "registered", columnDefinition = "timestamp default now()")
    private Date registered = new Date();
 
    @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = Role.class)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "role")
    private Set<Role> roles = new HashSet<Role>();
 
    @Column(name = "firstName")
    private String firstName;
 
    @Column(name = "LastName")
    private String LastName;
 
    @Column(name = "address")
    private String address;
 
    public User() {
    }

При удалении методом
Кликните здесь для просмотра всего текста
Java
1
2
3
4
  @Transactional
    @Modifying
    @Query("DELETE FROM User u WHERE u.id=:id ")
    int delete(@Param("id") int id);

возникает ошибка, что ограниечение внешнего ключа, имеется ссылка (Usera) на таблицу user_roles (таблица создаётся по полю private Set<Role> roles)

Как удалить Usera и все его дочерние таблицы? Может нужно дополниельные анатации прописать?

Spring Data Jpa
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KEKCoGEN
Модератор
 Аватар для KEKCoGEN
1786 / 1664 / 407
Регистрация: 28.12.2010
Сообщений: 6,752
22.11.2016, 11:11     Удаление Entity из БД #2
kostrorod, во-первых в спринг дата нет нужны писать такое удаление как у вас. Оно там уже реализовано.
Вто-вторых хорошей практикой является "мягкое" удаление. То есть вы добавляете в юезр поле deleted(boolean) и выставляете его в true когда удаляете юзера. Соответственно везде где вы получаете юзеров вы должны фильтровать по этому флагу.

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

Java
1
OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
kostrorod
38 / 27 / 5
Регистрация: 14.04.2012
Сообщений: 223
22.11.2016, 11:38  [ТС]     Удаление Entity из БД #3
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
в спринг дата нет нужны писать такое удаление как у вас. Оно там уже реализовано
Там реализовано void delete, а мне нужно узнать прошло ли корректно удаление.
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
хорошей практикой является "мягкое" удаление
Получается, что юзер не удаляется из БД, а просто скрывается?
KEKCoGEN
Модератор
 Аватар для KEKCoGEN
1786 / 1664 / 407
Регистрация: 28.12.2010
Сообщений: 6,752
22.11.2016, 11:55     Удаление Entity из БД #4
Цитата Сообщение от kostrorod Посмотреть сообщение
ам реализовано void delete, а мне нужно узнать прошло ли корректно удаление.
если удаление не произойдет, вылетит исключение.

Цитата Сообщение от kostrorod Посмотреть сообщение
Получается, что юзер не удаляется из БД, а просто скрывается?
да
kostrorod
38 / 27 / 5
Регистрация: 14.04.2012
Сообщений: 223
22.11.2016, 11:55  [ТС]     Удаление Entity из БД #5
При добавлении OneToMany
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
 @Enumerated(EnumType.STRING)
    @ElementCollection(targetClass = Role.class)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
    @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
    @Column(name = "role")
    private Set<Role> roles = new HashSet<Role>();

возникает ошибка
Кликните здесь для просмотра всего текста
java.lang.IllegalStateException: Failed to load ApplicationContext

at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emf' defined in class path resource [spring/spring-config.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: model.User.roles[model.Role]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:251)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 29 more
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: model.User.roles[model.Role]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1223)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:725)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1589)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 44 more
KEKCoGEN
Модератор
 Аватар для KEKCoGEN
1786 / 1664 / 407
Регистрация: 28.12.2010
Сообщений: 6,752
22.11.2016, 12:00     Удаление Entity из БД #6
Цитата Сообщение от kostrorod Посмотреть сообщение
Use of @OneToMany or @ManyToMany targeting an unmapped class: model.User.roles[model.Role]
this
kostrorod
38 / 27 / 5
Регистрация: 14.04.2012
Сообщений: 223
22.11.2016, 12:13  [ТС]     Удаление Entity из БД #7
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
this
это enum
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2016, 12:16     Удаление Entity из БД
Еще ссылки по теме:

Java БД Удаление строк из таблицы
Java БД MySQL Hibernate "Unknown entity: fed.guman.User"
Hibernate projection for nested entity Java БД
Запрос на удаление JDBC prepareStatement Java БД
Не проходит тест удаления Entity из БД по id Java БД PostgreSQL

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

Или воспользуйтесь поиском по форуму:
KEKCoGEN
Модератор
 Аватар для KEKCoGEN
1786 / 1664 / 407
Регистрация: 28.12.2010
Сообщений: 6,752
22.11.2016, 12:16     Удаление Entity из БД #8
kostrorod, у вас есть три варианта
1. Использовать soft delete
2. Сделать Role entity
3. Гуглить можно ли решить вашу проблему не создавая класс Role (таблица все равно создается полагаю)

Я бы на вашем месте выбрал первый вариант.
Yandex
Объявления
22.11.2016, 12:16     Удаление Entity из БД
Ответ Создать тему

Метки
delete, entity, spring data jpa
Опции темы

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