Как сохранить новый объект JSON с полем «многие к одному» по его идентификатору? - PullRequest
0 голосов
/ 31 января 2020

Я новичок в Spring Boot и у меня довольно неприятная проблема.

У меня есть две связанные сущности: транзакция и категория

Категория. java

@Data
@Entity
@Table(name = "t_categories")
public class Category extends BaseEntity {

  @Column(name = "category_name")
  private String name;
}

Транзакция. java

@Data
@Entity
@Table(name = "t_transactions")
public class Transaction extends BaseEntity {

  private String description;

  @ManyToOne
  @JoinColumn
  private Category category;
}

И когда я хочу добавить новую категорию, я просто делаю POST-запрос с JSON телом так:

{
  "name": "XYZ"
}

И создается новая категория (например, с идентификатором 1). Теперь я хочу добавить новую транзакцию с JSON следующим образом:

{
  "description": "Qwerty",
  "category": 1
}

Поэтому я хочу передать только идентификатор связанного объекта. Выдается следующая ошибка:

Cannot construct instance of `persistence.models.Category` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (1); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `persistence.models.Category` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (1)\n at [Source: (PushbackInputStream); line: 3, column: 12] (through reference chain: persistence.models.Category[\"parent\"])"

Что мне теперь делать? Поиск этой ошибки дает неубедительную информацию. Я новичок в этом, и это довольно загадочно.

1 Ответ

0 голосов
/ 31 января 2020
    @Data
    @Entity
    @Table(name = "t_categories")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "catId")
    public class Category extends BaseEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        Long catId;

        @Column(name = "category_name")
        private String name;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category")
        private Set<Transaction> transactions = new HashSet<>();
    }

    @Data
    @Entity
    @Table(name = "t_transactions")
    @JsonIdentityInfo(generator = 
    ObjectIdGenerators.PropertyGenerator.class, property = "transId")
    public class Transaction extends BaseEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
       Long transId

        private String description;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "cat_id", nullable = false)
        private Category category;
    }

Generate setters and getters method then you try this code.

При извлечении категории или транзакций. вы получите ошибку рекурсии. Вот почему я добавил эту аннотацию.

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "catId")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...