связать сущности по ссылке, используя пружинную загрузку, JPA - PullRequest
0 голосов
/ 01 апреля 2020

Скажем, у нас есть 2 класса Водитель и Автомобиль с Водителем, который имеет отношение многие к одному с Автомобилем следующим образом.

@Entity
@Table(name = "driver")
public class Driver {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Car car;

    ...

    // getter setter ignored for brevity
}

Есть ли способ установить значение car через например, опубликовать запрос, сославшись на car по его id просто JPA / Hibernate ? Я все еще новичок в загрузке Spring, поэтому я на самом деле думал о создании нового атрибута Long carId, а затем применил @JsonIgnore к car, в соответствии с { ссылка }. Или есть какое-то другое предложение или подход, чтобы получить то, чего я пытаюсь достичь?

PS: В базе данных они уже связаны по ссылке.

-- in postgres

...

driver_id    BIGINTEGER    REFERENCES  car (id)

...

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

пожалуйста, посмотрите здесь пример проекта, который я сделал для решения этой проблемы:

https://github.com/Fermi-4/StackOverflow---JPA-Relationships

После запуска на местном уровне, используйте Почтальон, чтобы настроить автомобиль на драйвер:

http://localhost: 9090 / api / assigncar? driverId = 1 & carId = 1

Driver Entity - с использованием Lombok

@Entity
@Table(name = "driver")
@Data
public class Driver {

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

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Car car;
}

Car Entity - использование Lombok и @JsonIgnore для предотвращения бесконечной рекурсии

@Entity
@Table(name = "car")
@Data
public class Car {

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

    @JsonIgnore
    @OneToMany
    private List<Driver> drivers = new ArrayList<Driver>();

}

Хранилища

public interface CarRepository extends JpaRepository<Car, Long> {    }
public interface DriverRepository extends JpaRepository<Driver, Long> {    }

Класс контроллера

@RequestMapping("/api")
@RestController
public class DriverController {

    @Autowired
    CarRepository _carRepo;

    @Autowired
    DriverRepository _driverRepo;

    @PostMapping("/assigncar")
    public Driver assignCarToDriver(@RequestParam Long driverId,@RequestParam Long carId) {
         Car car = _carRepo.findById(carId).get();
         Driver driver = _driverRepo.findById(driverId).get();
         driver.setCar(car);
         return _driverRepo.save(driver);
    }

}
1 голос
/ 01 апреля 2020

Когда вы добавляете нового водителя с помощью пост-запроса, вы можете назначить новый или существующий автомобиль в вашем json объекте (вы можете попытаться добавить cascadeType.ALL в свой @ManyToOne)

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