簡體   English   中英

春季啟動OnetoMany與JPA

[英]Spring boot OnetoMany with JPA

我已經開始使用spring boot進行測試,以創建一個具有簡單crud函數的Restful webservice.i有兩個實體類

Company.java

@Entity
@Table(name="Company_new")
public class Company {

@Id
@NotNull
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;



public Set<User> getUsers() {
    return users;
}
public void setUsers(Set<User> users) {
    this.users = users;
}
public void setId(int id) {
    this.id = id;
}

@NotNull
@Column(name="name")
private String name;

@OneToMany(mappedBy="company",cascade=CascadeType.ALL)
private Set<User> users;


public Company(String name){
    this.name = name;
}
public Company(){

}

public void setName(String name){
    this.name = name;
}

public String getName(){
    return name;
}

public int getId(){
    return id;
}
}

和User.java

  @Entity
  @Table(name="user_new")
  public class User {
  @Id
  @Column
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int idUser;

  @NotNull
  @Column
  private String name;

  @NotNull
  @Column
  private String userName;

  @NotNull
  @Column
  private String authLevel;

  @Column
  private String password;

  @ManyToOne
  @JoinColumn(name="idCompany")
  private Company company;

  // Public methods


  public Company getCompany(){
      return company;
  }

  public void setCompany(Company company){
      this.company = company;
  }




  public void setName(String name){
      this.name =name;
  }

  public void setUserName(String userName){
      this.userName = userName;
  }

 public String getName(){
     return this.name;
 }

 public String getUsername(){
     return this.userName;
 }

 public String getPassword(){
     return this.password;
 }


  public String getAuthLevel() {
    return authLevel;
}

public void setAuthLevel(String authLevel) {
    this.authLevel = authLevel;
}

public String getUserName() {
    return userName;
}

public void setId(int idUser) {
    this.idUser = idUser;
}

public void setPassword(String password) {
    this.password = password;
}

public int getId(){
      return this.idUser;
  }




 }

我希望與擁有眾多用戶的公司建立關系。 我試過像這樣預先存在用戶記錄

@Autowired
CompanyDao companyDao;
@RequestMapping(value = "/user/create", method = RequestMethod.POST)

public @ResponseBody ResponseEntity createUser(@RequestBody User user) {


    try {
        Company c = companyDao.findOne(user.getCompany().getId());
        user.setCompany(c);
        userDao.save(user);

    } catch (Exception e) {

        return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity<>(user, HttpStatus.OK);
}

我的數據以我想要的方式存在於數據庫中,但當我嘗試訪問公司記錄時,它會像這樣加載

階躍響應

很明顯,它會在一個循環中加載關系並最終產生堆棧溢出錯誤。 怎么解決這個?

根據您的預期結果,您可以:

  • public Set<User> getUsers()上使用@JsonIgnore以防止在public Company getCompany()上序列化用戶集合或@JsonIgnore以防止公司序列化

  • public Company getCompany()public Set<User> getUsers()@JsonBackReference使用@JsonManagedReference讓Jackson知道它是雙向關系。

PS。 如果您公開的API將由您無法控制的代碼使用,請考慮不直接公開實體,而是將它們映射到DTO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM