使用 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<User> getUsers()
上使用@JsonIgnore
以防止序列化用户集合或在public Company getCompany()
上使用@JsonIgnore
以防止公司序列化
在public Set<User> 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