Java Весеннее волшебное обновление JPA - PullRequest
1 голос
/ 28 мая 2020

У меня есть две сущности: Самолет

import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.AbstractPersistable;

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
//@ToString
public class Aircraft extends AbstractPersistable<Long> {

    private String name;
    @ManyToOne
    private Airport airport;

    @Override
    public String toString(){
        return name;
    }
}

И Аэропорт:

public class Airport extends AbstractPersistable<Long> {

    private String identifier;
    private String name;
    @OneToMany(mappedBy = "airport")
    private List<Aircraft> aircrafts = new ArrayList<>();

    @Override
    public String toString(){
        String aircraftString = aircrafts.stream().map(r -> r.toString()).collect(Collectors.joining(", "));
        return "airport " + name + " " + "[" + aircraftString + "]";
    }
}

И @PostMapping в @Controller вот так:

@PostMapping("/aircrafts/{aircraftId}/airports")
    public String assignAirport(@RequestParam Long airportId,@PathVariable Long aircraftId){
        Aircraft aircraft = aircraftRepository.getOne(aircraftId);
        Airport airport = airportRepository.getOne(airportId);

        aircraft.setAirport(airport);
        aircraftRepository.save(aircraft)
        System.out.println(airport.toString());
        System.out.println(aircraft.toString());
        return "redirect:/aircrafts";
    }

Это работает. Но не могу понять, как этот

private List<Aircraft> aircrafts = new ArrayList<>();

List обновляется? Сначала я подумал, что это должно работать так в @ Controller

airport.getAircrafts().add(aircraft);

Но это ничего не делает.

1 Ответ

1 голос
/ 28 мая 2020

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

 @OneToMany(mappedBy = "airport", cascade = CascadeType.ALL)
 private List<Aircraft> aircrafts = new ArrayList<>();

 public void addAircraft(Aircraft aircraft){
     aircraft.setAirport(this);
     aircrafts.add(aircraft);
 }

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

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