Я использую 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();
}
}
Вы можете добавить @JsonIgnore
аннотации либо wheelList
поля вашего Car
объект или car
поле в вашем Wheel
объекта. Это остановит сериализатор JSON от отображения этих полей в результирующем документе и рекурсивно, включая поле.
car
в объекте Wheel
чтобы оно показывало автомобиль вместе со всеми колесами, но не возвращалось к автомобилю.
Wheel
нуженCar
? У машин есть колеса, у колес нет машин.