Проблема при печати OnetoMany Reletionship

Я пытаюсь распечатать объект, который я получаю из базы данных, но каждый раз он выдает мне StackOverFlowError:

    SLF4J: Failed toString() invocation on an object of type [java.util.ArrayList]
Reported exception:
java.lang.StackOverflowError
    at java.base/java.lang.StringBuilder.<init>(StringBuilder.java:102)
    at com.example.NetflixProve.model.Tracker.toString(Tracker.java:116)
    at java.base/java.lang.String.valueOf(String.java:4215)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
    at com.example.NetflixProve.model.Channel.toString(Channel.java:33)
    at java.base/java.lang.String.valueOf(String.java:4215)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
    at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:457)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622)
    at java.base/java.lang.String.valueOf(String.java:4215)
....

то же самое, даже если я использую System.out.println();

Я удалил @Data и добавил @JsonBackedReference, но это не сработало. Мой код в сущностях:

@Entity
@Table(name= "TBL_CHANNEL")
@Getter
@Setter

public class Channel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Generated(GenerationTime.ALWAYS)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "channels")
    @JsonBackReference
    private Tracker tracker;
    @Column(name = "Channel_Name")
    private String channelName;

    @Override
    public String toString() {
        return "Channel{" +
                "id = " + id +
                ", tracker = " + tracker +
                ", channelName='" + channelName + '\'' +
                '}';
    }
}

и:

@Entity
@Table(name = "TBL_TRACKER")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tracker {
    @Id
    @Column(name = "ARCHIVE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Generated(GenerationTime.ALWAYS)
    private Long archiveId;

    @Column(name = "NOTIFICATION_ID")
    private String notificationId;

    @Column(name = "NOTIFICATION_ID_INDEX")
    private String notificationIdIndex;

    @Column(name = "DELIVERY_CHANNEL")
    @Enumerated(EnumType.STRING)
    private DeliveryChannel deliveryChannel;

    @Column(name = "SENDING_DATE")
    @DateTimeFormat
    private Date sendingDate;

    @Column(name = "SERVICE_ID")
    private String serviceId;

    @Column(name = "IDENTIFIER_TYPE")
    @Enumerated(EnumType.STRING)
    private IdentifierType identifierType;

    @Column(name = "IDENTIFIER")
    private String identifier;//fiscalCode

    @Column(name = "PAN")
    private String pan;


    @Column(name = "FLAG")
    @Enumerated(EnumType.STRING)
    private FlagEnum flag;

    @Column(name = "NOTIFICATION_CATEGORY")
    @Enumerated(EnumType.STRING)
    private NotificationCategory notificationCategory;

    @Column(name = "EXPIRING_DATE")
    @DateTimeFormat
    private Date expiringDate;

    @Column(name = "CREATION_DATE")
    @DateTimeFormat
    @CreationTimestamp
    private Date creationDate;

    @Column(name = "VISUALIZATION_DATE")
    @DateTimeFormat
    private Date visualizationDate;

    @Column(name = "EXPIRE_VISUALIZATION_DATE")
    @DateTimeFormat
    private Date expireVisualizationDate;


    @Column(name = "portal")
    private PortalEnum portalEnum;

    @Column(name = "campaign_name")
    private String campaignName;

    @Column(name = "business_priority")
    private int businessPriority;

    @OneToMany(cascade = {CascadeType.ALL},mappedBy = "tracker")
       @JsonManagedReference
    private List<Channel> channelsId;



    @Override
    public String toString() {
        return "Tracker{" +
                "archiveId = " + archiveId +
                ", notificationId='" + notificationId + '\'' +
                ", notificationIdIndex='" + notificationIdIndex + '\'' +
                ", deliveryChannel = " + deliveryChannel +
                ", sendingDate = " + sendingDate +
                ", serviceId='" + serviceId + '\'' +
                ", identifierType = " + identifierType +
                ", identifier='" + identifier + '\'' +
                ", pan='" + pan + '\'' +
                ", flag = " + flag +
                ", notificationCategory = " + notificationCategory +
                ", expiringDate = " + expiringDate +
                ", creationDate = " + creationDate +
                ", visualizationDate = " + visualizationDate +
                ", expireVisualizationDate = " + expireVisualizationDate +
                ", portalEnum = " + portalEnum +
                ", campaignName='" + campaignName + '\'' +
                ", businessPriority = " + businessPriority +
                ", channelsId = " + channelsId +
                '}';
    }

Ошибка возникает здесь, когда я пытаюсь получить код (позже я буду использовать DTO для печати)

public List<Tracker> findAll(){
    List<Tracker> trackerList= trackerRepo.findAll();
    log.info("tracker: {}",trackerList);
    return trackerList;
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать @Data, просто добавьте @ToString.Exclude в трекер-член Channel. Дело в том, чтобы не было круговых путей при вызове toString.

Другие вопросы по теме