Hibernate JPA Spring Boot игнорирует атрибуты JSON для конкретных запросов - PullRequest
0 голосов
/ 28 февраля 2019

У меня возникла проблема с JPA, когда я получаю много дополнительных данных, которые мне не нужны, а также много моих запросов.Я знаю, что могу обойти это, возвращая DTO в своих запросах, но потом я направляю полезность JPA, поэтому мне было интересно, есть ли лучший способ решить эту проблему.

Например, у меня есть два класса.Один называется Товар, а другой - Поставщик.Элемент продукта, может иметь поставщика как ManyToOne Отношения.Когда я делаю запрос на получение товара, мне не нужен адрес поставщика.Мне просто нужно имя и удостоверение личности.Однако, когда я делаю запрос на получение от поставщика, мне нужна вся информация, связанная с поставщиком.Есть ли способ указать это помимо простого возврата DTO без этой информации?

ProductItem.java

@Entity 
public class ProductItem {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id;
    @ManyToOne
    private Organization org;
    @ManyToOne
    private Supplier supplier;
    private String barCode;
    private String description;
    private String name;
    private Integer stock;
    private Integer caseQty;
    private BigDecimal caseCost;
    @ManyToMany(cascade=CascadeType.ALL)
    private List<Note> notes;
    @CreationTimestamp
    private LocalDateTime createdOn;
    @UpdateTimestamp
    private LocalDateTime updatedOn;

Supplier.java

@Entity 
public class Supplier {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id;
    private String name;
    @ManyToMany(cascade=CascadeType.ALL)
    private List<Note> notes;
    @ManyToOne(cascade=CascadeType.ALL)
    private Address address;
    @ManyToOne
    private Organization org;

Текущее получение http://localhost:8080/productitem/1

{
    "id": 1,
    "org": {
        "id": 1,
        "name": "Test",
        "address": {
             "name": "Test"
            },
        "website": null,
        "phone": null
    },
    "supplier": {
        "id": 1,
        "name": "Sams Club",
        "notes": [],
        "address": {
         "name": "Test"
        },
        "org": {
            "id": 1,
            "name": "Test",
            "address": {
             "name": "Test"
            },
            "website": null,
            "phone": null
        }
    },
    "barCode": "UPC134",
    "description": "This is description. This is description. This is description. This is description. ",
    "name": "Sunchips",
    "stock": 10,
    "caseQty": 34,
    "caseCost": 29.99,
    "notes": [
        {
            "id": 1,
            "title": "Product Item Created",
            "description": "Note created by user X on 12/16/2019 11:00PM"
        },
        {
            "id": 2,
            "title": "Product Item Updated",
            "description": "Product ITem updated stock by user X on 12/16/2019 11:00PM"
        }
    ],
    "createdOn": "2019-02-28T13:44:39",
    "updatedOn": "2019-02-28T13:44:39"
}

Попытка достичь Get http://localhost:8080/productitem/1

{
    "id": 1,
    "org": {
        "id": 1,
        "name": "Test",
        "address": null,
        "website": null,
        "phone": null
    },
    "supplier": {
        "id": 1,
        "name": "Sams Club",
    },
    "barCode": "UPC134",
    "description": "This is description. This is description. This is description. This is description. ",
    "name": "Sunchips",
    "stock": 10,
    "caseQty": 34,
    "caseCost": 29.99,
    "notes": [
        {
            "id": 1,
            "title": "Product Item Created",
            "description": "Note created by user X on 12/16/2019 11:00PM"
        },
        {
            "id": 2,
            "title": "Product Item Updated",
            "description": "Product ITem updated stock by user X on 12/16/2019 11:00PM"
        }
    ],
    "createdOn": "2019-02-28T13:44:39",
    "updatedOn": "2019-02-28T13:44:39"
}

Попытка достижения/ Current Get http://localhost:8080/supplier/1

 {
        "id": 1,
        "name": "Sams Club",
        "notes": [],
        "address": {
         "name": "Test"
        },
        "org": {
            "id": 1,
            "name": "Test",
            "address": null,
            "website": null,
            "phone": null
        }

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете использовать Jackson Json Views для управления сериализацией / десериализацией для определенных методов контроллера.Краткий пример:

Просмотреть определения:

public class Views {
    public static class BriefSupplier {
    }

    public static class FullSupplier extends BriefSupplier {
    }
}

Поставщик:

@Entity 
public class Supplier {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @JsonView(Views.BriefSupplier.class)
    private Long id;
    @JsonView(Views.BriefSupplier.class)
    private String name;
    @ManyToMany(cascade=CascadeType.ALL)
    @JsonView(Views.FullSupplier.class)
    private List<Note> notes;
    @ManyToOne(cascade=CascadeType.ALL)
    @JsonView(Views.FullSupplier.class)
    private Address address;
    @ManyToOne
    @JsonView(Views.FullSupplier.class)
    private Organization org;
}

Контроллеры:

@JsonView(Views.BriefSupplier.class)
@RequestMapping("/product/{productId}")
public Product getProduct(@PathVariable int productId) { ... }

@JsonView(Views.FullSupplier.class)
@RequestMapping("/supplier/{supplierId}")
public Supplier getSupplier(@PathVariable int supplierId) { ... }
0 голосов
/ 28 февраля 2019

JPA будет использовать все свойства класса, если вы не пометите их как @Transient:

@Transient
private String agencyName;

Аннотация @Column является необязательной и позволяет переопределить автосгенерированное имя столбца.Кроме того, атрибут длины @Column используется только при автоматической генерации определений таблиц, он не влияет на время выполнения.

Убедитесь, что вы импортируете javax.persistence.transient, а не какой-либо другой пакет.

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