在資料庫中保存資料時出現例外Cannot handle managed/back reference 'defaultReference': back reference type not compatible with managed type。持久化資料時出現例外。我認為問題出在注釋中@JsonManagedReference,@JsonBackReference但無法找出問題所在。
下面是代碼:
物體
@Entity
@Table(name = "user_master")
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer user_id;
private String name;
@JsonManagedReference
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "users_roles", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id") })
private List<Roles> roles;
// constructor and getter/setter
}
@Entity
@Table(name = "role_master")
public class Roles {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer role_id;
private String name;
@JsonBackReference
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "roles")
private List<Users> users;
// constructor and getter/setter
}
服務
@Override
public List<Users> addUserRole(List<Users> users) {
for(Users user: users)
{
for(Roles role: user.getRoles())
{
role.getUsers().add(user);
}
}
return userRepo.saveAll(users);
}
控制器
@RequestMapping(value = "/adduserrole", method = RequestMethod.POST)
public ResponseEntity<List<Users>> addUserRole(@RequestBody List<Users> users)
{
pojoService.addUserRole(users);
return ResponseEntity.ok(users);
}
郵差
[
{
"name": "Jack",
"roles": [
{
"name": "Engineer"
},
{
"name": "Doctor"
},
{
"name": "Charter Accountant"
}
]
}
]
例外
"message": "Cannot invoke \"java.util.List.add(Object)\" because the return value of \"com.rest.RestApiPojo.Entity.Roles.getUsers()\" is null",
uj5u.com熱心網友回復:
@JsonManagedReferencewith@JsonBackReference應該OneToMany在一側和ManyToOne另一側的雙向關系中使用,或者當雙方都是 type 時OneToOne。
如果您仔細檢查JsonBackReference 檔案,您將理解這一點
屬性的值型別必須是 bean:不能是 Collection、Map、Array 或列舉。處理鏈接,使得使用此注解注解的屬性不被序列化;并且在反序列化期間,它的值設定為具有“托管”(轉發)鏈接的實體。
在您的情況下,您有雙向ManyToMany的,這意味著在雙方都有對集合的參考。因此,您擁有的一側沒有一個兼容的屬性@JsonBackReference。
ManyToMany您的關系問題有兩種解決方案
- 洗掉
@JsonManagedReference和@JsonBackReference。選擇您希望對集合進行序列化和反序列化的一側。轉到您不希望其他集合被序列化和反序列化的另一側并使用注釋@JsonIgnore。 - 使用沒有回圈依賴的自定義 Dto,并讓您的控制器使用這些 Dto 而不是普通物體。
你還有另一個問題
你的控制器
@RequestMapping(value = "/adduserrole", method = RequestMethod.POST)
public ResponseEntity<List<Users>> addUserRole(@RequestBody List<Users> users)
{
pojoService.addUserRole(users);
return ResponseEntity.ok(users);
}
期望作為輸入的用戶串列。不是一個用戶。因此,當您想發送單個用戶時,您的 JSON 應該是
[
{
"name": "Jack",
"roles": [
{
"name": "Engineer"
},
{
"name": "Doctor"
},
{
"name": "Charter Accountant"
}
]
}
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416530.html
標籤:
上一篇:所有物體的JPAMappedSuperClass通用審計值
下一篇:常規函式呼叫
