我正在使用JpaRepository处理Spring Boot项目。当我尝试从控制器读取记录时,它给了我奇怪的巨大JSON响应。
我确信这是由映射引起的。
这是我的代码:
实体:客户
com.arj.entity.Customer
@Entity
@Table(name = "customers")
public class Customer {
@SuppressWarnings("unused")
private static final long serialVersionUID = 4910225916550731446L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column(name = "name", length = 256)
private String name;
@Column(name = "email", length = 256)
private String email;
@Column(name = "phone_number", length = 256)
private String phoneNumber;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private Set<CustomerAddress> customerAddresses = new HashSet<CustomerAddress>();
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private List<Order> orders;
@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;
@Column(name = "is_active", columnDefinition = "BIT default 1", length = 1, nullable = false)
private boolean isActive;
getters and setters ...
}
实体:经销商
com.arj.entity.Dealer
@Entity
@Table(name = "dealers")
public class Dealer {
@SuppressWarnings("unused")
private static final long serialVersionUID = 4910225916550731446L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column(name = "name", length = 256)
private String name;
@Column(name = "phone_number", length = 20)
private String phoneNumber;
@OneToMany(mappedBy = "dealer", cascade = CascadeType.ALL)
private Set<Order> orders = new HashSet<Order>();
@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;
@Column(name = "is_active", columnDefinition = "BIT default 1", length = 1, nullable = false)
private boolean isActive;
getters and setters ...
}
实体:订单
com.arj.entity.Order
@Entity
@Table(name = "orders")
public class Order {
@SuppressWarnings("unused")
private static final long serialVersionUID = 4910225916550731446L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;
@Column(name = "is_active", columnDefinition = "BIT default 1", length = 1, nullable = false)
private boolean isActive;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private Customer customer;
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "dealer_id", nullable = true)
private Dealer dealer;
getters and setters ...
}
OrderRepository
com.arj.repository.OrderRepository
@RepositoryRestResource
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query(value = "SELECT t FROM Order t WHERE t.status = :status")
public List<Order> getAllOrdersByStatus(@Param("status") String status);
}
OrderController
com.arj.controller.api.OrderController
@RestController
@RequestMapping("/api/v1/order")
public class OrderController {
@Autowired
OrderRepository orderRepository;
@RequestMapping(value = "/type/{status}", method = RequestMethod.GET)
public ResponseEntity<List<Order>> getAllOrdersByStatus(@PathVariable("status") String status) {
List<Order> orders = orderRepository.getAllOrdersByStatus(status);
if (orders.isEmpty()) {
System.out.println("Orders empty");
return new ResponseEntity<List<Order>>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<List<Order>>(orders, HttpStatus.OK);
}
}
我收到以下消息:
&#34; status&#34;:200,&#34; error&#34;:&#34; OK&#34;,&#34; message&#34;:&#34;无法写入JSON:无限递归(StackOverflowError);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无限递归(StackOverflowError)(通过引用链:com.aata.entity.Order [\&#34; customer \&#34;] - &gt; com.aata。 entity.Customer _ _ $$ jvsteb5_c [\&#34;订单\&#34;] - &GT; org.hibernate.collection.internal.PersistentBag [0] - &GT; com.aata.entity.Order [\&#34;客户\&#34;] - &GT; com.aata.entity.Customer _ _ $$ jvsteb5_c [\&#34;订单\&#34;
客户有OneToMany
的订单
客户订单ManyToOne
如果我选择customer
,我也想选择orders
如果我选择order
,我也想显示customer