При использовании метода createItem с Location, Location Creates, даже если он получил одинаковые значения во всех столбцах

Я использую 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();
    }

Я ожидаю, что после перекодирования приложение не создаст новое местоположение, если значения столбцов одинаковы.

Спасибо, люди! Если вы действительно поможете мне, я был бы так счастлив!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
26
1

Ответы 1

В ваших определениях Entity нет ничего, что могло бы сообщить ORM о желаемом ограничении.

Вы можете добавить @UniqueConstraint к @Table в своем объекте Location и указать, какие столбцы должны быть в уникальной комбинации (пример приведен в связанной документации):

@Table(
        name = "EMPLOYEE", 
        uniqueConstraints=
            @UniqueConstraint(columnNames = {"EMP_ID", "EMP_NAME"})
    )

Это добавит проверку в базу данных, если ORM управляет вашей схемой базы данных, которая будет вызывать исключение при нарушении.

Помимо определения ограничения @ThisIsNoZaku, вам все равно следует обрабатывать исключение, когда возникает дублирующаяся запись, насколько я знаю, это будет DataIntegrityViolationException для Spring Framework. Вы можете выполнить проверку с помощью простого блока try catch внутри вашего контроллера, и когда вы поймаете исключение, вы должны получить существующий Location, установить для него значение Item и повторно сохранить его.

Yavuz Tas 03.02.2019 22:33

Я пробовал ограничения, но это не сработало, потому что автоматически увеличивающийся идентификатор отличается, и не имеет значения, что у него одинаковые столбцы.

Mykolas Pinke 04.02.2019 19:07

Другие вопросы по теме