'Problem while print OnetoMany Reletionship
I'm tryng to print the object that I get from the database but everytime it give me the 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)
....
same even if I use System.out.println();
I deleted @Data and added @JsonBackedReference but it didn't work. My code in entities are:
@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 + '\'' +
'}';
}
}
and:
@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 +
'}';
}
The error happen here, when I'm trying to get the code, (later I will use the DTO to print)
public List<Tracker> findAll(){
List<Tracker> trackerList= trackerRepo.findAll();
log.info("tracker: {}",trackerList);
return trackerList;
}
Solution 1:[1]
You can use @Data, just add @ToString.Exclude to the tracker member of Channel. The point is to not have any circular paths while invoking toString.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Matei Macoveiciuc |
