我是靠谱客的博主 舒服咖啡,最近开发中收集的这篇文章主要介绍jpa 多层嵌套一对多_JPA:多对多关系-JsonMappingException:无限递归,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

I'm having trouble with a many to many relation with JPA.

My code looks as follows:

The Sensor class:

@Entity

@Table(name = "sensor")

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Sensor {

@Id

private long chipId;

@OneToMany(mappedBy = "sensor")

@JsonBackReference

private Set userLinks;

private String firmwareVersion;

private long creationTimestamp;

private String notes;

private long lastMeasurementTimestamp;

private long lastEditTimestamp;

private double gpsLatitude;

private double gpsLongitude;

private double gpsAltitude;

private String country;

private String city;

private boolean indoor;

private boolean published;

}

The user class:

@Entity

@Table(name = "user")

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@JsonManagedReference

private int id;

private String firstName;

private String lastName;

private String email;

private String password;

@OneToMany(mappedBy = "user")

private Set sensorLinks;

private int role;

private int status;

private long creationTimestamp;

private long lastEditTimestamp;

}

And the Link class (relation class):

@Entity

@Table(name = "link")

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Link {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Integer id;

@ManyToOne

@JoinColumn(name = "user_id")

@MapsId("user_id")

private User user;

@ManyToOne

@JoinColumn(name = "sensor_id")

@MapsId("sensor_id")

private Sensor sensor;

private boolean owner;

private String name;

private int color;

private long creationTimestamp;

}

The controller:

...

@RequestMapping(method = RequestMethod.GET, path = "/user/{email}", produces = MediaType.APPLICATION_JSON_VALUE)

@ApiOperation(value = "Returns details for one specific user")

public User getUserByEmail(@PathVariable("email") String email) {

return userRepository.findByEmail(email).orElse(null);

}

...

The UserRepository:

public interface UserRepository extends JpaRepository {

Optional findByEmail(String email);

@Modifying

@Query("UPDATE User u SET u.firstName = ?2, u.lastName = ?3, u.password = ?4, u.role = ?5, u.status = ?6 WHERE u.id = ?1")

Integer updateUser(int id, String firstName, String lastName, String password, int role, int status);

}

I want to achieve, that the user endpoint shows all linked sensors with that particular user.

What I get is only an error message:

JSON mapping problem:

com.chillibits.particulatematterapi.model.db.main.User["sensorLinks"];

nested exception is

com.fasterxml.jackson.databind.JsonMappingException: Infinite

recursion (StackOverflowError) (through reference chain:

com.chillibits.particulatematterapi.model.db.main.User["sensorLinks"])

How can I fix this issue?

Thanks in advance

Marc

------------------------------------ Edit -----------------------------------

According to Abinash Ghosh's answer, I added following DTOs:

UserDto:

@Data

@NoArgsConstructor

@AllArgsConstructor

public class UserDto {

private int id;

private String firstName;

private String lastName;

private Set sensorLinks;

private int role;

private int status;

private long creationTimestamp;

private long lastEditTimestamp;

}

LinkDto:

@Data

@NoArgsConstructor

@AllArgsConstructor

public class LinkDto {

private Integer id;

private SensorDto sensor;

private boolean owner;

private String name;

private int color;

private long creationTimestamp;

}

And the mapper (I realized it a bit different, but it should be the same):

public UserDto getUserByEmail(@PathVariable("email") String email) {

User user = userRepository.findByEmail(email).orElse(null);

return convertToDto(user);

}

private UserDto convertToDto(User user) {

return mapper.map(user, UserDto.class);

}

This leads to following Exception:

2020-04-13 14:22:24.383 WARN 8176 --- [nio-8080-exec-2] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@68ab57c7

1) Error mapping com.chillibits.particulatematterapi.model.db.main.User to com.chillibits.particulatematterapi.model.io.UserDto

1 error] with root cause

java.lang.StackOverflowError: null

at com.mysql.cj.NativeSession.execSQL(NativeSession.java:1109) ~[mysql-connector-java-8.0.19.jar:8.0.19]

...

解决方案

Seems that you should not use Lombok @Data in such cases.

最后

以上就是舒服咖啡为你收集整理的jpa 多层嵌套一对多_JPA:多对多关系-JsonMappingException:无限递归的全部内容,希望文章能够帮你解决jpa 多层嵌套一对多_JPA:多对多关系-JsonMappingException:无限递归所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部