【问题标题】:Unable to evaluate the expression Method threw 'java.lang.StackOverflowError' exception. with nested relations between entities无法评估表达式方法引发了“java.lang.StackOverflowError”异常。具有实体之间的嵌套关系
【发布时间】:2019-01-18 12:39:30
【问题描述】:

我总有一天会遇到一个问题。 所以让我们开始吧。我有 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;

优惠

@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;

还有标签。

@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;

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";
}

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

public interface AnimalRepository extends JpaRepository<Animal, Long> {


    List<Animal> findAnimalByUser(User user);


}

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

imgur 的链接enter link description here 关系可能有问题,但究竟是什么?感谢所有的答案。 :)

【问题讨论】:

  • 请勿发布小图片,尤其是在您不了解我们的显示设置的情况下。在您的问题中发布堆栈跟踪。

标签: java spring spring-data-jpa


【解决方案1】:

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

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

【讨论】:

  • 好的,我明白了。但是如何做到这一点呢?我第一次尝试自己的 toString() 是这样的“ String toStrint(){ return get.Name()+”,"+getSomething().
  • 对我来说是正确的答案。关于无限处理的解释也是正确的。
【解决方案2】:

如果您使用的是 lombok,只需添加;

@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 2021-07-15
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多