Spring boot entity не обновляется - PullRequest
0 голосов
/ 22 октября 2018

следующие методы моего контроллера:

@RequestMapping(value="/updateApi", method=RequestMethod.POST)
public String updateApiPost(@ModelAttribute("api") Api api, HttpServletRequest request) {
    adminAppLogger.info("Attempting to update api with id {}:"+api.getId()+" title: {}"+api.getTitle());
    apiService.save(api);

    MultipartFile apiImage = api.getApiImage();

    if(!apiImage.isEmpty()) {
        try {
            byte[] bytes = apiImage.getBytes();
            String name = api.getId() + ".png";

            Files.delete(Paths.get("src/main/resources/static/image/api/"+name));

            BufferedOutputStream stream = new BufferedOutputStream(
                    new FileOutputStream(new File("src/main/resources/static/image/api/" + name)));
            stream.write(bytes);
            stream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
        adminAppLogger.info("Successfully updated api with title {}:"+api.getTitle()+" {"+api+"}");


        return "redirect:/api/apiInfo?id="+api.getId();
    }

Это мой метод GET, когда я нажимаю кнопку обновления, он показывает мою форму с уже существующей информацией о сущности из базы данных MYSQL

@RequestMapping("/updateApi")
public String updateApi(@RequestParam("id") Long id, Model model) {
    Api api = apiService.findOne(id);
    model.addAttribute("api", api);

    return "updateApi";
}

Я ожидаю, что он обновит БД, но он вставит новую запись в журналы БД: Hibernate: вставьте в api_info (активный, автор, категория, код, дата, описание, data_json, number_of_lines, прогресс, проект, response_json, заголовок, url) значения (?,?,?,?,?,?,?,?,?,?,?,?,?)

Follwing - мой сервис и хранилище:

@Service
public class ApiServiceImpl implements ApiService{

    @Autowired
    private ApiRepository apiRepository;

    public Api save(Api api) {
        return apiRepository.save(api);
    }

    public List<Api> findAll() {
        return (List<Api>) apiRepository.findAll();
    }

    public Api findOne(Long id) {
        return apiRepository.findOne(id);
    }

    public void removeOne(Long id) {
        apiRepository.delete(id);
    }
}

Репозиторий:

public interface ApiRepository extends CrudRepository<Api, Long>{

}

1 Ответ

0 голосов
/ 22 октября 2018

Если вы получаете INSERT, где вы ожидаете UPDATE, это означает, что:

  • Любой объект, переданный в save, не имеет установленного идентификатора, таким образом, persist вызывается изнутри
  • Или объект с указанным идентификатором отсутствует в базе данных, поэтому слияние не удается (и, возможно, оно сохраняется как запасной вариант, не знаю)

Проверьте, установлено ли у объекта поле идентификатора.

Поскольку я не вижу поле id в списке полей вставки, я думаю, что в нем отсутствует идентификатор, так как в противном случае он будет включен во вставку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...