如何在Spring Boot / JPA中构造具有多个外键的实体?

时间:2019-01-14 06:02:25

标签: mysql spring hibernate spring-boot jpa

我有一个表“ Details”,其中包含来自“ City”,“ Town”,“ branch”表的信息。它们都是一次性配置表,它们的信息是恒定的。它们永远不需要更新。

“详细信息”表具有来自这些表的外键引用,例如“ city_id”,“ town_id”,“ branch_id”。

现在的问题是,当上载“详细信息”的数据时,它具有“ City_name”,“ town_name”和“ branch name”。我需要将此数据转换为ID以将其存储在“详细信息”中

我应该怎么做才能实现自己的目标?

示例:

 Data uploads: "City name","town name", "branch name".

城市:

id  | City_name
 1  | city name
 2  | city name 2

城镇:

id  | Town_name
 1  | town name
 2  | town name 2

分支

id  | branch_name
 1  | branch name
 2  | branch name 2

现在,必须以“详细信息”存储数据

details_id | city_id | town_id | branch_id
 1         |1        |1        |1

1 个答案:

答案 0 :(得分:3)

您需要获取引用的对象,然后创建实体并保存。应该是这样的:

City foundCity = CityRepository.findByName(cityName).orElseThrow(() -> new EnityNotFoundException("City not found"));
...
Detail detail = new Detail();
detail.setCity(foundCity);
...
detailRepository.save(detail);

如果要创建的Details数量很多,并且引用对象的数量不是很大,则可能需要先将所有引用对象加载到内存中,然后再继续操作。喜欢

List<City> cities = cityRepository.findAll();
...

List<Detail> detailsToSave = new ArrayList<>();

City foundCity = cities.stream()
        .filter(item -> name.equals(item.getName()))
        .orElseThrow(() -> new EnityNotFoundException("City not found"));
    ...
    Detail detail = new Detail();
    detail.setCity(foundCity);
    ...
    detailsToSave.add(detail);
    ....

 detailRepository.saveAll(detailsToSave);