Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622

Spring MVC JpaRepository не работает delete

29.08.2021, 17:14. Показов 1251. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Небольшой проект Spring MVC JpaRepository (MySQL) не работает delete
При сохранении рекорда в таблицу TEST одновременно пишется рекорд в таблицу FILE_UPLOAD
Конфигурация
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@Configuration
@EnableTransactionManagement
@ComponentScan({ "ru.javawebinar.topjavaout.configuration" })
@PropertySource(value = { "classpath:db/mysql.properties" })
//@PropertySource(value = {"classpath:db/postgres.properties"})
@EnableJpaRepositories(basePackages = "ru.javawebinar.topjavaout.repository")
public class JpaConfiguration {
 
    @Autowired
    private Environment environment;
 
    @Bean
    public DataSource dataSourceJpa() {
        DriverManagerDataSource dataSourceJpa = new DriverManagerDataSource();
        dataSourceJpa.setDriverClassName(environment.getRequiredProperty("jpa.driverClassName"));
        dataSourceJpa.setUrl(environment.getRequiredProperty("jpa.url"));
        dataSourceJpa.setUsername(environment.getRequiredProperty("jpa.username"));
        dataSourceJpa.setPassword(environment.getRequiredProperty("jpa.password"));
        return dataSourceJpa;
    }
 
    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSourceJpa());
        sessionFactory.setPackagesToScan(new String[]{"ru.javawebinar.topjavaout.model"});
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }
 
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSourceJpa());
        factoryBean.setPackagesToScan(new String[] { "ru.javawebinar.topjavaout.model" });
        factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
        return factoryBean;
    }
 
    /*
     * Provider specific adapter.
     */
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        return hibernateJpaVendorAdapter;
    }
 
    private Properties hibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        hibernateProperties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        hibernateProperties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        hibernateProperties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
        return hibernateProperties;
    }
 
    @Bean
    @Autowired
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager txManagerJpa = new JpaTransactionManager();
        txManagerJpa.setEntityManagerFactory(emf);
        return txManagerJpa;
    }
 
}
Две сущности
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Entity
@Table(name = "TEST")
public class Test implements Serializable {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
 
    @Column(name = "NAME", unique = true, nullable = false)
    private String name;
 
    @OneToMany(targetEntity = FileUpload.class, mappedBy = "test", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<FileUpload> fileUploadSet = new HashSet<>();
...
 
}
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
@Entity
@Table(name = "FILE_UPLOAD")
public class FileUpload implements Serializable {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
 
    @Column(name = "TITLE")
    private String title;
 
    @Column(name = "LOCATION")
    private String location;
 
    @Column(name = "SIZE")
    private Integer size;
 
    @Column(name = "TYPE")
    private String type;
 
    @Column(name = "FILE_NAME")
    private String file_name;
 
    @Column(name = "TEST_ID")
    private Integer test_id;
 
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "document_id", referencedColumnName = "id", insertable = false, updatable = false)
    private Document document;
 
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "test_id", referencedColumnName = "id", insertable = false, updatable = false)
    private Test test;
 
}
Таблицы в базе
SQL
1
2
3
4
5
CREATE TABLE TEST
(
    id              BIGINT          PRIMARY KEY NOT NULL    AUTO_INCREMENT,
    name            VARCHAR(30)
);
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE FILE_UPLOAD
(
    id              BIGINT          PRIMARY KEY NOT NULL    AUTO_INCREMENT,
    title           VARCHAR(30),
    location        VARCHAR(30),
    SIZE            BIGINT,
    TYPE            VARCHAR(30),
    file_name       VARCHAR(100),
    test_id         BIGINT,
    FOREIGN KEY (test_id) REFERENCES TEST(id) ON DELETE CASCADE
);
В контроллере
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    @RequestMapping(value = {"/delete-test/{id}"}, method = RequestMethod.GET)
    public String deleteTest(@PathVariable Integer id,
                             HttpServletRequest request,
                             RedirectAttributes redirectAttributes) {
 
        List<FileUpload> fileUploadList = fileUploadService.listFiles();
        String rootDirectory = request.getSession().getServletContext().getRealPath(userMethood.configProper().get("file.path"));
 
        for (int i = 0; i < fileUploadList.size(); i++)
            if (id.equals(fileUploadList.get(i).getTest_id())) {
                String fileName = fileUploadList.get(i).getFile_name();
                deleteFile(rootDirectory, fileName);
            }
 
        Test test = testService.findById(id);
 
        testService.deleteTestById(id);
 
        return "redirect:/tests";
    }
Далее сервисы и репозиторий
Java
1
2
3
4
5
6
7
8
public interface TestServiceRepo {
 
    List<Test> listTests();
    Test findById(Integer id);
    void saveTest(Test test);
    void deleteTestById(Integer id);
    void updateTest(Test test);
}
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
@Service("testServiceRepo")
@Transactional
public class TestServiceImplRepo implements TestServiceRepo {
 
    @Autowired
    private TestRepository testRepository;
 
    public Test findById(Integer id) {
        return testRepository.findById(id);
    }
 
    public List<Test> listTests() {
        return testRepository.findAll();
    }
 
    public void deleteTestById(Integer id) {
        testRepository.deleteById(id);
    }
 
    public void saveTest(Test test) {
        testRepository.save(test);
    }
 
    public void updateTest(Test test) {
        Test entity = testRepository.findById(test.getId());
        entity.setName(test.getName());
        entity.setFile_name(test.getFile_name());
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Repository("TestRepository")
@Transactional(readOnly = true)
public interface TestRepository extends JpaRepository<Test, Long> {
 
    @Query("select b from Test b where b.id = :id")
    Test findById(@Param("id") Integer id);
 
    @Modifying
    @Transactional
    @Query("delete from Test b where b.id = :id")
    void deleteById(@Param("id") Integer id);
 
    @Modifying(clearAutomatically = true)
    @Transactional
    @Query("update Test u set u.name = :name where u.id = :id")
    void updateById(String name, Integer id);
 
}
При сохранении рекорда в таблицу TEST одновременно пишется рекорд в таблицу FILE_UPLOAD
Редактируется нормально
Не работает delete если в таблице FILE_UPLOAD имеется рекорд привязанный к таблице TEST через test_id.
Я полагал что должно работать каскадное удаление при удалении рекорда из таблицы TEST. Но оно не работает.
Ошибка типа
Java
1
17:03:25.595 [http-nio-8080-exec-9] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Cannot delete or update a parent row: a foreign key constraint fails (`topjavaout`.`file_upload`, CONSTRAINT `FKt15myxnh372qu5mwcqtln9ufe` FOREIGN KEY (`test_id`) REFERENCES `test` (`id`))
Интересно то что при переходе на базу Postgres такой проблемы нет.
Подскажите пожалуйста что я делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2021, 17:14
Ответы с готовыми решениями:

Spring mvc pdf view не работает с русским теском
Всем привет! В spring mvc не обходимо создать контролер который будет возврщать pdf документ. Нашел две библиотеки которые позволяют...

Ошибка при создании Spring Tool Suite -> Spring MVC Project
Добрый день. Подскажите в чем проблема. Я делаю Spring Tool Suite -&gt; Spring MVC Project и создаю проект с каким-нибудь названием, например...

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2021, 17:14
Помогаю со студенческими работами здесь

Перевод проекта из Spring Maven в обычный Spring MVC
Здравствуйте. Подскажите, реально ли взять готовый проект, например -...

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные программы. Использовал Netty, Apache...

JpaRepository не работает
Не работает jparepository package com.it.domain; import javax.persistence.*; @Entity public class Ticket { @Id ...

Spring MVC, Spring REST
Всем привет! Изучаю фреймворк Spring и возникло несколько вопросов в процессе, на которые не уверен однозначно, что до конца понимаю....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru