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




Метод toString() в классе Animal вызывает эту проблему. Метод строит возвращаемую строку поочередно из классов Animal и Tag, которые ссылаются друг на друга, что приводит к бесконечному процессу.
Избавьтесь от аннотации @Data (которая включает аннотацию @ToString) и создайте собственную реализацию метода toString().
Хорошо, я понял идею. Но как именно это сделать? Моя первая попытка создать собственный toString() была примерно такой: "String toString(){ return get.Name()+","+getSomething().
Правильный ответ для меня. Объяснение про бесконечную обработку тоже верно.
Если вы используете ломбок, просто добавьте;
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
не публикуйте маленькое изображение, особенно если вы понятия не имеете о наших настройках отображения. опубликуйте трассировку стека в своем вопросе.