我有一个问题使用JPA和关系一对多与杰克逊和春天休息......我试图找到多个解决方案,但任何事情对我有用,我不知道问题出在哪里。
例如,我有一个表团队,其中包含一对多/多对一的关系
我有两个存储库用于Team,另一个用于Player
Team >>> has Many >> Player
Player >>> many to one >> Team
我的实体团队有以下内容
@Entity
@Table(name = "teams")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Team {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private long teamId;
private String abbreviation;
private String team;
private String simpleName;
private String logo;
@OneToMany(cascade = {CascadeType.ALL,CascadeType.PERSIST,CascadeType.MERGE}, mappedBy = "team")
@Column(nullable = false)
private List<Player> players;
Theirs getters/setter , hashcodes and string similars.
另一方面是实体玩家
@Entity
@Table(name = "player")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "teams_id", nullable=true)
private Team team;
private String name;
所以,我在存储库中的控制器中进行了典型的get调用。
@RestController
@RequestMapping("/api/public/team")
public class TeamController {
@Autowired
private TeamRepository teamRepository;
@Autowired
private GenericMethods genericMethods;
@GetMapping(value = "/{id}")
public Team getPersona(@PathVariable("id") int id) {
return teamRepository.findOne(genericMethods.toLong(id));
}
和存储库
@Repository
public interface TeamRepository extends JpaRepository<Team, Long> {
}
现在,当我调用此端点时,我收到以下答案,我认为这是不正确的,我只需要一个带有播放器的列表
{
"id":2,
"teamId":0,
"abbreviation":null,
"team":null,
"simpleName":"Betis",
"logo":null,
"players":[
{
"id":1,
"team":2,
"category":{
"id":1,
"nombre":"juvenil a",
"language":null,
"description":null,
"league":[
],
"players":[
1,
{
"id":2,
"team":2,
"category":1,
"name":"hulio"
}
]
},
"name":"pepe"
},
2
]
}
我需要访问Player和Team的信息,所以我不能使用@JsonIgnoreProperties
任何人都可以帮忙解决这个问题吗?
根据您真正想要实现的目标,您可以尝试不同的选择。我不确定你是否正在使用(或打算使用)spring-data-rest。
1.专用存储库
如果相关实体没有自己的存储库,Spring数据将会嵌入相关实体。尝试创建public interface PlayersRepository extends JpaRepository...
2.懒加载
你为什么使用FetchType.EAGER
?试试没有它。
3.预测
预测仅适用于列表,而不适用于单个实体(即不明确要求您提供的内容)。您可以隐藏Teams集合中的玩家,即使它是默认返回的,如下所示:
@Projection(name = "noPlayers", types = { Team.class })
public interface TeamWithoutPlayers {
Long getId();
long getTeamId();
String getAbbreviation();
String getTeam();
String getSimpleName();
String getLogo();
}
More info - Spring Data Rest Projections
4.使用Team
在@JsonIgnore
实体中序列化期间忽略
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "teams_id", nullable=true)
private Team team;
最后的想法
使用spring-data-rest,您可以扩展CrudRepository
而不是JpaRepository
,并直接通过存储库访问该项目。这样你就不需要编写控制器了。