Невозможно оценить метод выражения. Возникла исключительная ситуация java.lang.StackOverflowError. с вложенными отношениями между сущностями - PullRequest
0 голосов
/ 18 января 2019

Я борюсь через один день с одной проблемой. Итак, начнем. У меня есть 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 введите описание ссылки здесь Возможно, что-то не так с отношениями, но что именно? Спасибо за все ответы. :)

1 Ответ

0 голосов
/ 18 января 2019
Метод

toString() в классе Animal вызывает эту проблему. Сборки метода поочередно возвращают строку из классов Animal и Tag, оба имеют ссылку друг на друга, что приводит к бесконечному процессу.

Избавьтесь от аннотации @Data (которая включает аннотацию @ToString) и создайте собственную реализацию метода toString().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...