【问题标题】:JPA : How to create a self-join entity?JPA:如何创建自加入实体?
【发布时间】:2020-01-20 18:00:49
【问题描述】:

我有一个带有助手列的用户实体。

每个用户都有一个助手,但也有圈子。

例如:用户 A 的助手是用户 B,用户 B 的助手是 用户 A。

如果我使用@ManyToOne 和@OneToMany 注解,那么在将对象转换为JSON 时会出现无限递归,即使是@JsonManagedReference 和 @JsonBackReference 没有帮助。

基础实体:

@MappedSuperclass
@Data
public class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @Version
    private int version;
}

用户:

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "Users")
public class User extends BaseEntity {

    @Column
    private String username;

    @Column
    private String name;

    @JsonManagedReference
    @ManyToOne
    @JoinColumn(name = "assistant_id")
    private User assistant;

    @JsonBackReference
    @OneToMany(mappedBy = "assistant")
    private Set<User> assistants;


}

Spring 有机会解决这个问题吗?

【问题讨论】:

  • 发布您的代码!

标签: java spring jpa


【解决方案1】:

@JsonManagedReference/@JsonBackReference 无济于事,因为“正向”引用仍然可以形成一个循环,即使“反向”引用没有被序列化。

您想要可能将分配给assistant 属性的User 序列化而没有它自己的 assistant 属性(这样任何循环都会中断)。本质上,您与here 有相同的问题,除了在您的情况下AB 是同一类。

除了我链接到的问题中描述的解决方案之外,您还需要指定在序列化对象时使用哪个@JsonView。请参阅“在 Spring 中使用 JSON 视图”部分 here

【讨论】:

  • 不确定您所说的“工作”是什么意思。 assistants 默认情况下已经延迟加载,就像任何其他对多关联一样。如果没有@JsonIgnore Jackson 仍然会尝试序列化该属性,但会触发延迟加载
【解决方案2】:

能否基于同一张表创建Assistant实体并加入?

【讨论】:

  • 这似乎不是一个答案,而是一个建议,因此更好的建议位置是问题的评论部分。
  • 很抱歉,这是一个解决方案。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多