2016-05-21 3 views
1

я начал тестирование с пружинным загрузки, чтобы создать RESTful веб-сервиса, который имеет простые Crud functions.i имеют две объектные классыSpring загрузки OnetoMany с JPA

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; 
    } 




} 

Я хочу иметь отношения с компанией, имеющей много пользователей. Я попытался presisting записи пользователя, как этого

@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); 
} 

мои данные presisting в базе данных так, как я хочу , но когда я пытаюсь получить доступ к записи компании он загружает как этого

respones

, очевидно, он загружает отношения в цикле и в конечном итоге дает ошибку переполнения стека. как это решить?

+0

, пожалуйста, добавьте трассировку стека ошибок – PeaceIsPearl

ответ

2

В зависимости от желаемого результата вы можете:

  • использование @JsonIgnore на public Set<User> getUsers(), чтобы предотвратить сериализации коллекции пользователей или @JsonIgnore на public Company getCompany(), чтобы предотвратить компанию Сериализация

  • использование @JsonManagedReference на public Set<User> getUsers() и @JsonBackReference на public Company getCompany() чтобы Джексон знал, что это двунаправленное отношение.

PS. Если API, который вы подвергаете, будет потребляться кодом, который вы не контролируете, рассмотрите not exposing entities directly, но mapping them to DTOs