使用 JPA 的 Spring Boot OnetoMany

Posted

技术标签:

【中文标题】使用 JPA 的 Spring Boot OnetoMany【英文标题】:Spring boot OnetoMany with JPA 【发布时间】:2016-09-18 15:54:15 【问题描述】:

我已经开始使用 Spring Boot 进行测试,以创建一个具有 简单的 crud 函数。我有两个实体类

公司.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);

我的数据以我想要的方式保存在数据库中 但是当我尝试访问公司记录时,它会像这样加载

显然它在一个循环中加载关系并最终给出堆栈溢出错误。如何解决?

【问题讨论】:

请同时添加错误堆栈跟踪 【参考方案1】:

根据您想要的结果,您可以:

public Set&lt;User&gt; getUsers() 上使用@JsonIgnore 以防止序列化用户集合或在public Company getCompany() 上使用@JsonIgnore 以防止公司序列化

public Set&lt;User&gt; getUsers() 上使用@JsonManagedReference 和在public Company getCompany() 上使用@JsonBackReference,让Jackson 知道这是一个双向关系。

PS。如果您公开的 API 将被您无法控制的代码使用,请考虑 not exposing entities directly 但 mapping them to DTOs

【讨论】:

嗨 Miensol,非常感谢您抽出宝贵的时间回答这篇文章。我在休息服务中使用它。添加您在提及编译错误中使用的注释后。但我无法在其余响应中看到用户详细信息。你能帮我解决这个问题吗?谢谢。

以上是关于使用 JPA 的 Spring Boot OnetoMany的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot与spring-data-JPA的简单集成使用

Spring Boot:在Spring Boot中使用Mysql和JPA

Spring------Spring boot data jpa的使用方法

Spring boot JPA

Spring boot JPA

Spring boot JPA