Огромный JSON при сохранении и возврате сущности с использованием Hibernate

1

Я использую Hibernate для сохранения моих объектов в базе данных. Для простого примера у меня есть два объекта:

Автомобиль:

@Entity
@Table(name = "car")
public class Car implements Serializable {
    @Id
    @GeneratedValue
    private long id;
    private String name;
    @OneToMany(cascade = CascadeType.PERSIST)
    private List<Wheel> wheelList;

    public Car() {
    }

    public Car(String name, List<Wheel> wheelList) {
        this.name = name;
        this.wheelList = wheelList;
    }

и колесо:

@Entity
@Table(name = "wheel")
public class Wheel implements Serializable {
    @Id
    @GeneratedValue
    private long id;
    private int size;
    @ManyToOne(cascade = CascadeType.PERSIST)
    private Car car;

    public Wheel() {
    }

    public Wheel(int size, Car car) {
        this.size = size;
        this.car = car;
    }

Я использую Spring Framework (MVC) для создания клиента REST, из которого я возвращаю JSON. И теперь: я создал простой @Repository и @Service.

Я хотел попробовать, если вы сохраните работы, поэтому я создал простой объект Car с его списком колес и т.д., А затем, на уровне @Service, я сохранил его и возвратил объект автомобиля в контроллер.

Наконец, когда я запускаю URL-адрес контроллера, я получаю HUGE json, потому что у каждого автообъекта есть список колес, а затем у каждого колеса есть свой автомобиль, у которого снова есть список, а в списке есть колеса, у которых есть автомобили и так далее. Вот почему мой JSON настолько велик.

{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":{"id":1,"name":"SomeName","wheelList":[{"id":1,"size":1,"car":...........

Что я делаю неправильно? Как мне решить эту проблему?

Остальная часть кода, если вам это нужно: (сделано только для тестов, я знаю о некорректно-кодированном стиле здесь) Репозиторий:

@Repository
public class TestImpl {
    @PersistenceContext
    private EntityManager entityManager;

    public Car saveCar(Car car){
        entityManager.persist(car);
        return car;
    }
}

обслуживание

@Service
@Transactional
public class TestService {
    @Autowired
    private TestImpl test;

    public Car save(){
        Car car = new Car();
        car.setName("SomeName");
        List<Wheel> list = new ArrayList<Wheel>();
        list.add(new Wheel(1, car));
        car.setWheelList(list);
        test.saveCar(car);
        return car;
    }
}

контроллер:

@Controller
public class TestController {
    @Autowired
    private TestService testService;

    @RequestMapping(value = "/los")
    @ResponseBody
    public Car los(){
        return testService.save();
    }
}
  • 0
    Похоже, отношения все не так. Зачем Wheel нужен Car ? У машин есть колеса, у колес нет машин.
  • 0
    На самом деле основные отношения между пользователями и отчетами. У каждого пользователя есть список отчетов, и у каждого отчета есть свой владелец (репортер). Авто и Колеса сделаны только для испытаний
Теги:
spring
hibernate

1 ответ

1
Лучший ответ

Вы можете добавить @JsonIgnore аннотации либо wheelList поля вашего Car объект или car поле в вашем Wheel объекта. Это остановит сериализатор JSON от отображения этих полей в результирующем документе и рекурсивно, включая поле.

  • 0
    да, но когда я добавляю @JsonIgnore к свойству wheelList, мой JSON выглядит так: {"id": 1, "name": "SomeName"}. Так что ему не хватает свойства списка.
  • 0
    @azalut добавьте свойство в поле car в объекте Wheel чтобы оно показывало автомобиль вместе со всеми колесами, но не возвращалось к автомобилю.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню