无法评估表达式 Method 抛出“java.lang.StackOverflowError”异常。实体之间的嵌套关系

Ret*_*n.h 5 java spring spring-data-jpa

有一天,我正在与一个问题作斗争。让我们开始吧。我有 3 个类,如标签、优惠和动物

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "animals")
public class Animal {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "animal_id")
private Long id;

@Column(name = "name")
@NotNull
private String name;

@Column(name = "description")
@NotNull
private String text;

@Column(name = "quantity")
@NotNull
private int count;


@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "tag_id", nullable = false)
private Tag tags;


@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "offer_id", nullable = true)
private Offer offer;
Run Code Online (Sandbox Code Playgroud)

优惠

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "offer")
public class    Offer {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "offer_id")
private Long id;

@Column(name = "title")
@NotNull
private String title;

@Column(name = "description")
@NotNull
private String text;


@Column(name = "price")
@NotNull
private int price;

@Column(name = "contact")
@NotNull
private int contact;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date", nullable = false, updatable = false)
@CreationTimestamp
private java.util.Date createDate;



@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", nullable = false)
private User user;


@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "tag_id", nullable = false)
private Tag tags;


@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "animal_id", nullable = false)
private Animal animal;
Run Code Online (Sandbox Code Playgroud)

和标签。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "tags")
public class Tag {


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "tag_id")
private long id;

@Column(name = "name")
@Email(message = "*Please provide a valid tag")
@NotEmpty(message = "*Please provide an tag")
private String name;


@OneToMany(mappedBy = "tags")
private Set<Offer> offers;

@OneToMany(mappedBy = "tags")
private Set<Animal> animals;
Run Code Online (Sandbox Code Playgroud)

OneToOne 关系是因为我想为一只动物提供一个报价。

我也有控制器喜欢显示添加新的报价。

@RequestMapping(value = "/postForm", method = RequestMethod.GET)
public String newOffer(Principal principal,Model model) {

  String e_mail = principal.getName();
  System.out.println(e_mail);
  User user = userService.findUserByEmail(e_mail);

  Offer offer = new Offer();
  offer.setUser(user);
    Long id = user.getId();

    List<Tag> tags =  tagService.findAlltags();


   List<Animal> animal = animalRepository.findAnimalByUser(user);

    model.addAttribute("tags", tags);
    model.addAttribute("animals",animal);
    model.addAttribute("offer", offer);

        return "/postForm";
}
Run Code Online (Sandbox Code Playgroud)

我正在传递诸如动物和标签之类的列表来选择标签,以及分配给用户的动物。我的动物仓库。

public interface AnimalRepository extends JpaRepository<Animal, Long> {


    List<Animal> findAnimalByUser(User user);


}
Run Code Online (Sandbox Code Playgroud)

实际上,我在正确显示动物方面存在问题。标签显示正确,但动物列表无法评估动物类别内的标签。更具体地说,让我向您展示 Inteliji 的回溯屏幕

imgur 的链接在此处输入链接描述 可能关系有问题,但究竟是什么?感谢所有的答案。:)

Kam*_*l W 6

toString()Animal类中的方法会导致此问题。方法交替地构建返回字符串,Animal并且Tag类都相互引用,从而产生无限的过程。

去掉@Data注解(包括@ToString注解),自己实现toString()方法。

  • 对我来说正确的答案。关于无限处理的解释也是正确的。 (2认同)