I have the following sample entities:
Institution
@Data
@Entity
@NoArgsConstructor
@EntityListeners(InstitutionAuditListener.class)
public class Institution extends Auditable<String> {
@OneToMany(mappedBy = "institution", cascade = CascadeType.ALL)
@JsonManagedReference
private List<RegisteredProgram> registeredPrograms;
private String name;
}
RegisteredProgram
@Data
@NoArgsConstructor
@Entity
@EntityListeners(RegisteredProgramAuditListener.class)
public class RegisteredProgram extends Auditable<String> {
private String name;
@ManyToOne
@JoinColumn(name = "institution_id", nullable = false)
@JsonBackReference
private Institution institution;
@Embedded
private RegistrationRequirement registrationRequirement;
@OneToMany(mappedBy = "registeredProgram", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Official> officialList;
}
Official
@Data
@Entity
@EntityListeners(OfficialAuditListener.class)
@NoArgsConstructor
public class Official extends Auditable<String> {
private String name;
private String position;
@ManyToOne
@JoinColumn(name = "REGISTERED_PROGRAM_ID", nullable = false)
@JsonBackReference
private RegisteredProgram registeredProgram;
}
Audit Log
@Entity
@Data
@NoArgsConstructor
public class AuditLog extends AuditBase {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private Long entityId;
@Type(type = "yes_no")
private Boolean isDeleted = false;
@Column(columnDefinition = "json")
@Convert(converter = JpaConverterJson.class)
private String jsonObject;
}
When I attempted to save an instance of Official's object toString() value into AuditLog's jsonObject field, I encountered the error below:
java.lang.StackOverflowError: null
at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:173) ~[na:na]
at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:174) ~[na:na]
at com.tesda8.region8.program.registration.model.entities.RegisteredProgram.toString(RegisteredProgram.java:26) ~[classes/:na]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:473) ~[na:na]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at com.tesda8.region8.program.registration.model.entities.Institution.toString(Institution.java:23) ~[classes/:na]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at com.tesda8.region8.program.registration.model.entities.RegisteredProgram.toString(RegisteredProgram.java:26) ~[classes/:na]
I was wondering if there are any annotations in spring/hibernate that could prevent this issue to occur or is there any other way that i could save the object's (JSON) value to an object's column in spring? I was assuming that @JsonManagedReference and @JsonBackReference should've prevented this issue to happen.
UPDATE
- I already tried to used toString() method for objects through Lombok's
@Dataannotation - I also tried to use
String.valueOf(official)