При использовании метода createItem с Location, Location создает, даже если он получил одинаковые значения во всех столбцах - PullRequest
0 голосов
/ 03 февраля 2019

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

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

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

1 Ответ

0 голосов
/ 03 февраля 2019

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

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

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

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

...