Autowired Repository обновляет существующую сущность вместо создания новой - PullRequest
0 голосов
/ 03 февраля 2019

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

Репозиторий

@Repository
public interface AgentsRepository extends JpaRepository<Country, Long> {
}

Контроллер

@Autowired
private AgentsRepository agentsRepository;

@Autowired
private CountriesRepository countriesRepository;

// Add new agent
@GetMapping("/country/{id}/agent/add")
public String addNewAgent(@PathVariable(name = "id") String countryId, Model model){
    model.addAttribute("country_id", countryId);
    model.addAttribute("agent", new Agent());
    return "agent/add";
}

@PostMapping("/country/{id}/agents/new")
public String createAgent(@PathVariable(value = "id") String countryId, @ModelAttribute Agent agent){
    return countriesRepository.findById(Long.parseLong(countryId)).map(country -> {
        agent.setCountry(country);
        agentsRepository.save(agent);
        return "redirect:/country/" + countryId + "/show/agents";
    }).orElseThrow(() -> new ResourceNotFoundException("CountryId " + countryId + " not found"));
}

Класс страны

@Entity
@Table(name = "countries")
public class Country implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
private String name;

Класс агента

@Entity
@Table(name = "agents")
public class Agent implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

@NotNull
private String status = "classified";

@NotNull
private String first_name;

@NotNull
private String last_name;

@NotNull
@Max(value = 2147483647)
private Integer documents;

@NotNull
@Max(value = 8)
private Integer people_recruited;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "country_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Country country;

Добавление агентаHTML

    <form action="#" th:action="@{'/country/{id}/agents/new'(id=${country_id})}" th:object="${agent}" method="post">
        <p>Name: <input type="text" th:field="*{first_name}" /></p>
        <p>Surname: <input type="text" th:field="*{last_name}"></p>
        <p>Documents: <input type="number" max="2147483647" th:field="*{documents}" /></p>
        <p>People recruited: <input  type="number" max="8" th:field="*{people_recruited}"></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Попробуйте это:

@PostMapping("/country/{id}/agents/new")
public String createAgent(@PathVariable(value = "id") String countryId, @ModelAttribute Agent agent){
    return countriesRepository.findById(Long.parseLong(countryId)).map(country -> {
        Agent agentToBeSaved = new Agent();
        agentToBeSaved.setCountry(country);
        agentToBeSaved.setStatus(agent.getStatus());
        agentToBeSaved.setFirstName(agent.getFirstName());
        agentToBeSaved.setDocuments(agent.getDocuments());
        agentToBeSaved.setPeopleRecruited(agent.getPeopleRecruited());
        agentsRepository.save(agentToBeSaved);
        return "redirect:/country/" + countryId + "/show/agents";
    }).orElseThrow(() -> new ResourceNotFoundException("CountryId " + countryId + " not found"));
}

И если это работает - тогда вы передаете некоторый идентификатор объекту агента из пользовательского интерфейса.

0 голосов
/ 04 февраля 2019
@ModelAttribute Agent agent

Передаете ли вы агент из модели (UI)?или попробуйте установить его в null в контроллере.Скорее всего, пользовательский интерфейс отправляет фиктивный идентификатор для Agent, который одинаков для всех Agents, поэтому JPA обновляет его.

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