@OneToMany не выбирает существующих детей - PullRequest
0 голосов
/ 05 мая 2018

У меня есть код для архивирования @ManyToOne отношения с помощью Hibernate. У меня есть два класса Package и Address. В Address я хотел бы иметь уникальные записи, где каждый адрес чем-то отличается от другого. Тогда у меня есть Package, который использует его.

@Entity
public class Address {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false, updatable = false)
  private Long id;

  String street_with_number;
  String city;
  String region;
  //...
}

@Entity 
public class Package {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false, updatable = false)
  private Long id;

  String eshopId;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name="destination_address_id")
  private Address destination_address;

  //...
}

Тогда у меня есть JpaRepository для создания репо:

@RepositoryRestResource
public interface PackageRepository extends JpaRepository<Package, Long> {
   //...
  }

После этого я использую его в контроллере REST

@RestController
@RequestMapping("/api/")
public class RestController {
  private PackageRepository packageRepository;

  @Inject
  public void setRepository(PackageRepository packageRepository) {
    this.packageRepository = packageRepository;
  }

  @RequestMapping(method = RequestMethod.POST)
  public ResponseEntity<?> addPack(@RequestBody Package pack) {
    return new ResponseEntity<>(packageRepository.save(pack), HttpStatus.CREATED);
  }
}

Затем, используя HTTP REST, я отправляю json вот так

{
   "eshopId" : 1,
   "destination_address": {
       "street_with_number": "string",
       "city": "string",
       "region": "string"
   }
} 

, которая создает одну запись в таблице Package и одну в адресе с OK, а также destination_address_id, указывающий вправо Address.id. Затем я снова отправляю тот же JSON, и hibernate создает новый Address, такой же, как тот, что был раньше, и не использует его повторно.

Я бы хотел, чтобы hibernate проверил, существует ли адрес, и если да, он не создаст новую строку в таблице Address, а использует ту, которая уже существует. Это как-то просто возможно? Такое поведение создает две повторяющиеся строки (отличается только идентификатор), что не то, что я хочу. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 05 мая 2018

Вы должны проверить, был ли этот адрес уже определен вами. Не существует механизма гибернации, который мог бы сделать это за вас.

Я бы посоветовал вам создать AddressService с методом, скажем, getOrCreate(), который бы проверял, существует ли адрес с переданными данными или он должен быть создан. Для вас это своего рода правило бизнеса, поэтому создание дополнительного слоя между контроллерами и репозиториями кажется хорошей идеей.

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