Я использую h2 в базе данных памяти и не хочу создавать повторяющиеся местоположения в своей базе данных. Только когда я использую createItem и идентификатор столбца местоположения ввода вручную, он записывает его в одно и то же место. В противном случае, даже если GPS-координаты города страны являются одним и тем же приложением, запишите его в другое место с его идентификатором.
Я пытался понять, но это не работает
У меня есть эти сущности.
@Entity
@Table(name = "item_System_items")
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String description;
private BigDecimal price;
private Integer stock;
@ManyToOne
@JoinColumn(name = "location_id")
@Cascade(value = {org.hibernate.annotations.CascadeType.ALL})
private Location location;
И
@Entity
@Table(name = "item_System_locations")
public class Location {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String country;
private String city;
private String street;
private String gpsCoordinates;
СЕТТЕРЫ И ГЕТТЕРЫ ЕСТЬ ТАМ, Я ПРОСТО НЕ ПУБЛИКУЮ ИХ ЗДЕСЬ
Контроллер
@RestController
@RequestMapping("/items")
public class ItemsController {
@Autowired
private ItemsService service;
@PostMapping
@ResponseStatus(value=HttpStatus.CREATED)
public int createItem(@RequestBody Item item) {
return service.createItem(item);
}
Услуга
@Service
@Transactional
public class ItemsService {
@Autowired
private ItemJPARepository repository;
public int createItem(Item item) {
return repository.save(item).getId();
}
Я ожидаю, что после перекодирования приложение не создаст новое местоположение, если значения столбцов одинаковы.
Спасибо, люди! Если вы действительно поможете мне, я был бы так счастлив!




В ваших определениях Entity нет ничего, что могло бы сообщить ORM о желаемом ограничении.
Вы можете добавить @UniqueConstraint к @Table в своем объекте Location и указать, какие столбцы должны быть в уникальной комбинации (пример приведен в связанной документации):
@Table(
name = "EMPLOYEE",
uniqueConstraints=
@UniqueConstraint(columnNames = {"EMP_ID", "EMP_NAME"})
)
Это добавит проверку в базу данных, если ORM управляет вашей схемой базы данных, которая будет вызывать исключение при нарушении.
Я пробовал ограничения, но это не сработало, потому что автоматически увеличивающийся идентификатор отличается, и не имеет значения, что у него одинаковые столбцы.
Помимо определения ограничения @ThisIsNoZaku, вам все равно следует обрабатывать исключение, когда возникает дублирующаяся запись, насколько я знаю, это будет
DataIntegrityViolationExceptionдля Spring Framework. Вы можете выполнить проверку с помощью простого блока try catch внутри вашего контроллера, и когда вы поймаете исключение, вы должны получить существующийLocation, установить для него значениеItemи повторно сохранить его.