首页 > 解决方案 > 在 JSON 响应中获取实体而不是其 ID

问题描述

我正在尝试获取Users数据库中存在的所有实体的列表。它有另一个实体,Group作为它的子元素,我在获得用户后需要使用它。

用户.java:-

@Data
@Entity
@Table(name = "user")
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id", nullable = false)
  private Integer userId;

  @Column(name = "name", nullable = false, unique = true)
  private String name;

  @Column(name = "photo_url")
  private String photoURL;

  @Column(name = "email", nullable = false)
  private String email;

  @OneToMany(targetEntity = Group.class, mappedBy = "admin", fetch = FetchType.LAZY, cascade = {
      CascadeType.MERGE,
      CascadeType.REFRESH
  })
  private List<Group> owningGroup;

  // Other functions
}

Group.java:-

@Data
@Entity
@Table(name = "room")
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
public class Group {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE)
  @Column(name = "id", nullable = false)
  private Integer id;

  @Column(name = "name", nullable = false, unique = true)
  private String name;

  @Column(name = "photo_url")
  private String photoURL;

  @ManyToOne(cascade = {
      CascadeType.MERGE,
      CascadeType.REFRESH
  })
  @JoinColumn(name = "admin_id", nullable = false)
  private User admin;

  // Other functions
}

我从中获取“用户”实体的服务类:-

@Service
public class UserServiceImpl implements UserService {

  @Autowired
  private final UserRepository userRepository;

  @Override
  public List<User> getAllUsers() {
    return this.userRepository.findAll();
  }
}

当我请求获取所有用户时,这就是我得到的:

{
  "@id": 1,
  "userId": 1,
  "name": "Devian Sonato",
  "photoURL": null,
  "email": "deviansonato@gmail.com",
  "owningGroup": [
    2
  ]
}

正如您在owningGroup我得到一个 int 值中看到的那样id,是实体的而不是实体本身。

起初,我认为这是因为我已设置FetchTypeLazy但即使在设置为之后Eager我仍然获得 ID 而不是实体。

我在这里犯了什么错误?我需要单独获取组还是不应该将 Group-id 列表保留在User对象中?

标签: javaspringspring-boothibernatespring-data-jpa

解决方案


所有代码都是正确的,你可以试试下面的代码,希望它对你有帮助。

@OneToMany(targetEntity = Group.class, mappedBy = "admin", fetch = FetchType.LAZY, cascade = CascadeType.All)
private List<Group> owningGroup;

推荐阅读