# restful-api **Repository Path**: chindar/restful-api ## Basic Information - **Project Name**: restful-api - **Description**: Restful标准及JPA的OneToMany基本操作 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-04 - **Last Updated**: 2021-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HTTP动词 对于资源的具体操作类型,由HTTP动词表示。 常用的HTTP动词有下面五个(括号里是对应的SQL命令)。 ```text GET(SELECT):从服务器取出资源(一项或多项)。 POST(CREATE):在服务器新建一个资源。 PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。 PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。 DELETE(DELETE):从服务器删除资源。 ``` 还有两个不常用的HTTP动词。 ```text HEAD:获取资源的元数据。 OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。 ``` 下面是一些例子。 ```text GET /zoos:列出所有动物园 POST /zoos:新建一个动物园 GET /zoos/ID:获取某个指定动物园的信息 PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息) PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息) DELETE /zoos/ID:删除某个动物园 GET /zoos/ID/animals:列出某个指定动物园的所有动物 DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物 ``` # fixed 内存溢出 ## 代码 ```java @Setter @Getter @Entity @Table(name = "tb_zoo") public class Zoo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotBlank private String name; private String address; private String url; @OneToMany(mappedBy = "zoo") private List animalList; } ``` ```java @Setter @Getter @Entity @Table(name = "tb_animal") public class Animal { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotBlank private String name; @NotBlank private String kind; @ManyToOne private Zoo zoo; } ``` 调用GET /zoos/{id}/animals 时, 会出现内存溢出。 ```text Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"]->org.hibernate.collection.internal.PersistentBag[0]->com.chinda.core.entity.Animal["zoo"]->com.chinda.core.entity.Zoo["animalList"])] with root cause ``` 出现此情况是因为转换json时会递归转换, 最终导致内存溢出。 `解决方案: 忽略掉一方的json转换即可。` 修复后代码: ```java @Setter @Getter @Entity @Table(name = "tb_animal") public class Animal { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotBlank private String name; @NotBlank private String kind; @JsonIgnore @ManyToOne private Zoo zoo; } ``` # OneToMany嵌入式 > 此种情况多适用于多方无需CRUD, 只需要单方直接维护情况。 请参考: ContactInfo.java ```java @Data @Embeddable public class ContactInfo { private String phoneNumber; private String address; } ``` User.java ```java @Setter @Getter @Entity @Table(name = "tb_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ElementCollection @CollectionTable(name = "tb_contact_user") private List contactInfoList; } ``` # 添加Model属性校验 因`validation`本身校验抛出异常不好控制, 所以需要统一处理, 封装成view中可控数据。 ```java public class ValidatorUtils { private static Validator validator; static { validator = Validation.buildDefaultValidatorFactory().getValidator(); } /** * 校验对象 * @param object 待校验对象 * @param groups 待校验的组 * @throws RRException 校验不通过,则报RRException异常 */ public static void validateEntity(Object object, Class... groups) throws RRException { Set> constraintViolations = validator.validate(object, groups); if (!constraintViolations.isEmpty()) { String message = constraintViolations.stream().map(e -> (e.getPropertyPath() + e.getMessage())) .collect(Collectors.joining(StrUtil.COMMA)); throw new RRException(message); } } } ``` # 全局异常处理 为了保证客户端能够收到友好的提示。 ```java @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public RRException exceptionHandler(Exception e) { log.error("系统异常:", e); return new RRException(e.getMessage(), e); } /** * @Valid全局异常处理 * @param e * @return */ @ExceptionHandler({MethodArgumentNotValidException.class}) public RRException validExceptionHandler(MethodArgumentNotValidException e) { log.error("数据校验异常: ", e); List fieldErrors = e.getBindingResult().getFieldErrors(); List errorMessages = CollUtil.newArrayList(); Iterator var5 = fieldErrors.iterator(); while(var5.hasNext()) { FieldError error = (FieldError)var5.next(); errorMessages.add(error.getField() + error.getDefaultMessage()); } return new RRException(errorMessages.stream().collect(Collectors.joining(StrUtil.COMMA))); } } ``` # 分页处理 ## maven添加jpa插件 ```xml com.mysema.maven apt-maven-plugin 1.1.3 generate-sources process target/generated-sources/queries com.querydsl.apt.jpa.JPAAnnotationProcessor ``` ## 添加querydsl依赖 ```xml com.querydsl querydsl-jpa com.querydsl querydsl-core com.querydsl querydsl-apt ``` 通过maven编译会根据Entity实体类在`target/generated-sources/queries`目录下生成以Q开头的类供查询动态编写sql使用。。 ## 编写分页返回封装类 将数据库中查询出的数据封装成此类, 方便前端页面使用。 ```java @Setter @Getter public class RPage implements Serializable { private static final long serialVersionUID = 1L; /** * 总记录数 */ private int totalCount; /** * 每页记录数 */ private int pageSize; /** * 总页数 */ private int totalPage; /** * 当前页数 */ private int currPage; /** * 列表数据 */ private List list; /** * 分页 * @param list 列表数据 * @param totalCount 总记录数 * @param pageSize 每页记录数 * @param currPage 当前页数 */ public RPage(List list, int totalCount, int pageSize, int currPage) { this.list = list; this.totalCount = totalCount; this.pageSize = pageSize; this.currPage = currPage; this.totalPage = (int)Math.ceil((double)totalCount/pageSize); } public RPage(Page page) { this.list = page.getContent(); this.totalCount = (int)page.getTotalElements(); this.pageSize = page.getPageable().getPageSize(); this.currPage = page.getPageable().getPageNumber() + 1; this.totalPage = (int)Math.ceil((double)totalCount/pageSize); } } ``` ## 编写查询基类BaseQO提供分页功能 ```java @Getter @Setter public class BaseQO implements Serializable { private static final long serialVersionUID = 1L; /** * 每页显示多少条 */ private Integer pageSize = 20; /** * 当前页码 */ private Integer currPage = 1; /** * 排序 */ private String order; /** * 排序字段 */ private String orderField; public PageRequest getPageRequest() { orderField = SQLFilter.sqlInject(orderField); Sort.Direction direction = Sort.Direction.ASC; if (StrUtil.isNotBlank(order)) { if (StrUtil.equalsIgnoreCase(order, Sort.Direction.DESC.name())) { direction = Sort.Direction.DESC; } return PageRequest.of(currPage - 1, pageSize, Sort.by(direction, orderField)); } return PageRequest.of(currPage - 1, pageSize); } } ``` 通过此类会将分页及排序封装, 提供给JPA暴露功能使用。 ## 编写动态sql 通过BooleanBuilder及Querydls提供的功能编写动态sql。 # 封装Service简化代码 ```java @Transactional(rollbackFor = Exception.class) public abstract class ServiceImpl, T> { @Autowired private D baseDao; /** * 获取全部数据 * * @return */ public List queryAll() { return baseDao.findAll(); } /** * 获取数据详情 * * @param id * @return */ public T getOne(Long id) { return baseDao.findById(id).orElseThrow(()-> new RRException("该数据不存在")); } /** * 保存数据 * * @param t * @return */ public T save(T t) { return baseDao.save(t); } /** * 删除数据 * * @param id * @return */ public void remove(Long id) { baseDao.deleteById(id); } } ``` ## demo ```java public class ZooServiceImpl extends ServiceImpl implements ZooService{ } ``` # 权限 修复`no Session`问题 ```text org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.chinda.core.entity.SysUser.roleList, could not initialize proxy - no Session at com.chinda.common.config.security.UserAuthenticationProvider.authenticate(UserAuthenticationProvider.java:61) ~[classes/:na] ``` 原因为查询出`sysRoleList`, session已经回收, 61行代码便利sysRoleList时, 找不到session获取不到子集数据,故会抛出异常。 解决方案: 将此处代码纳入`@Transactional(readOnly = true, rollbackFor = Exception.class)`管理