2015-04-27 22 views
6

Tôi có một đến nhiều mối quan hệ giữa đội và Player, tôi có thể tạo ra một đội với JSON saudữ liệu Xuân nghỉ ngơi một đến nhiều đứa trẻ delete đối tượng

{ 
    "id": 1, 
    "name": "MyTeam5", 
    "players": [ 
     { 
      "name": "player5" 
     }, 
     { 
      "name":"player10" 
     } 
    ] 
} 

Tuy nhiên, khi tôi cố gắng xóa một đối tượng trẻ em bằng cách loại bỏ nó khỏi danh sách với JSON sau

{ 
     "id": 1, 
     "name": "MyTeam5", 
     "players": [ 
      { 
       "id": 2 
       "name": "player5" 
      } 
     ] 
    } 

tôi nhận được một lỗi nói

"A collection with cascade=\"all-delete-orphan\" was no longer referenced by the owning entity instance: org.a.c.domain.user.Team.players" 

Đây là mã tổ chức của nhóm và người chơi của tôi -

@Data 
@Entity 
public class Team { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    private String name; 

    @JsonManagedReference 
    @OneToMany(mappedBy="team", cascade= CascadeType.ALL, orphanRemoval=true) 
    List<Player> players = new ArrayList<Player>(); 

} 

@Data 
@Entity 
public class Player { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    private String name; 

    @JsonBackReference 
    @ManyToOne 
    @JoinColumn(name = "team_id") 
    private Team team; 
} 

Tôi đang làm gì sai? Jackson có thể lập bản đồ từ một đến nhiều mối quan hệ một cách hoàn hảo khi tôi tạo một Nhóm mới với nhiều người chơi nhưng khi tôi cập nhật/xóa các cầu thủ khỏi Team json, nó không thành công với cùng một lỗi. Có thể là bộ sưu tập được tái tạo đó là lý do tại sao hibernate ném lỗi, nếu vậy làm thế nào tôi nên sửa chữa nó? Vui lòng giúp

Trả lời

4

Sự cố bạn đang gặp phải đến từ việc thay thế danh sách players. Hibernate không cần phải theo dõi các phần tử nào được loại bỏ và thực hiện điều này với sự trợ giúp của việc triển khai danh sách cụ thể. 'PersistentList` (theo như tôi nhớ)

Sự cố có nhiều khả năng là bạn hoặc một thứ gì đó, gọi là setPlayers. Thay thế hiệu quả danh sách bằng một phiên bản mới.

Để khắc phục vấn đề này bạn có hai khả năng:

  • tránh những cuộc gọi đến setPlayers bằng cách sử dụng getPlayers.remove/add
  • hoặc sửa đổi setPlayers để tránh thiết lập một danh sách mới, nhưng thay vì xóa danh sách nạp và thêm tất cả các yếu tố từ danh sách đối số.

Một ví dụ nhanh:

public void setPlayers(List list) { 
    if (this.players == null) { 
     this.players = list; 
    } else { 
     this.players.clear(); 
     this.players.addAll(list); 
     // you might need to take care of bidirectional references here 

} 
+0

Mã này sẽ đi đâu? Câu hỏi này dành riêng cho phần còn lại của dữ liệu vào mùa xuân, có cách nào để giải quyết tình huống này không? – Jay

+0

Mã này sẽ là setter bên trong thực thể jpa. Tôi không biết bất kỳ cách nào cụ thể về mùa xuân-dữ liệu này. –

+0

Làm cho tinh thần, cảm ơn. – Jay

0

Bạn có thể đúng rằng bộ sưu tập đang được thay thế.

Tôi giả định rằng có TeamRepository cũng như PlayerRepository và cả hai đều được xuất. Điều đó có nghĩa là phản hồi Team hiển thị liên kết players nơi bạn có thể đăng URI của những người chơi sẽ có mặt trong Nhóm. Nếu thực thể người chơi không tồn tại, bạn tạo nó trước. Đó là cách Spring Data REST hoạt động.

Cũng xin lưu ý rằng việc hiển thị ID cơ sở dữ liệu không chính xác là RESTful. ID của tài nguyên là URI.

0

Tôi đã có cùng một loại sự cố khi sử dụng khởi động mùa xuân. Cập nhật mùa xuân-boot-khởi-mẹ từ 1.4.3.RELEASE để 1.4.4.RELEASE giải quyết vấn đề:

<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.4.4.RELEASE</version> 

Dưới mui xe, nó được cập nhật một số phụ thuộc, một trong số đó là mùa xuân-dữ liệu còn lại -webmvc. Nó được cập nhật từ 2.5.6.RELEASE thành 2.5.7.RELEASE:

<groupId>org.springframework.data</groupId> 
<artifactId>spring-data-rest-webmvc</artifactId> 
<version>2.5.7.RELEASE</version> 

Đây là bản cập nhật phụ thuộc cụ thể đã giải quyết được sự cố của tôi.

Tôi không biết đó là lỗi hay tính năng của phần còn lại của dữ liệu vào mùa xuân. Trường hợp sử dụng này thực sự là cơ bản. Nhưng kể từ khi sử dụng tất cả các khung công tác (spring-data-rest, spring-data-jpa) hoặc ngăn xếp mặc định khởi động mùa xuân là tất cả về trừu tượng, có vẻ hợp lý với tôi rằng nó được xử lý bằng phần mềm-spring-rest, JSON được gửi là đúng và cấu hình thực thể JPA là chính xác. Lý tưởng nhất, tôi không muốn đối phó với các đặc tính Hibernate.

0

Bạn đang sử dụng PATCH og PUT?

Trong trường hợp Nghỉ dữ liệu mùa xuân, gọi PUT sẽ thay thế hoàn toàn tài nguyên của bạn (và như tôi hiểu, tạo bộ sưu tập mới, không được theo dõi), trong khi PATCH sẽ chỉ cập nhật một phần thực thể của bạn.

Trong trường hợp của bạn, tôi muốn nói sử dụng PATCH là cuộc gọi chính xác và theo kinh nghiệm của tôi, đôi khi có thể khắc phục vấn đề này.

Các vấn đề liên quan