保存对象的toString值时出现Stackoverflow错误-Java/Hibernate/Spring [英] Stackoverflow error when saving an Object's toString value - Java/Hibernate/Spring
问题描述
我有以下示例实体:
机构
@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;
}
已注册程序
@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;
}
官方
@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;
}
审核日志
@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;
}
当我尝试将 Official 对象的 toString()值的实例保存到 AuditLog 的 中时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]
我想知道在spring/hibernate中是否有任何注释可以阻止此问题的发生,或者是否还有其他方法可以在春季将对象的(JSON)值保存到对象的列中?我以为@JsonManagedReference
和@JsonBackReference
应该可以防止发生此问题.
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.
更新
- 我已经尝试通过Lombok的
@Data
批注对对象使用 toString() 方法 - 我也尝试使用
String.valueOf(official)
- I already tried to used toString() method for objects through Lombok's
@Data
annotation - I also tried to use
String.valueOf(official)
推荐答案
为Deinum先生对我的问题的见解加油打气. https://stackoverflow.com/a/65388643/14806310
Cheers for M. Deinum's insights regarding my issue. https://stackoverflow.com/a/65388643/14806310
我的问题的根本原因确实是使用龙目岛(Lombok)的@Data
中的toString()
将我的实体的详细信息保存到一个字段中,这是一个问题.我确实尝试覆盖RegisteredProgram
的toString()
方法,该方法随后解决了StackOverflow错误,但是我保存JSON对象的方法仍然很奇怪.
The root cause of my problem was indeed using toString()
by Lombok's @Data
to save the details of my entity to a field, which was problematic right off the bat. I did try to override the toString()
method of RegisteredProgram
, which then solved the StackOverflow error, but still my approach on saving the JSON object was weird.
因此,我没有通过toString()
将对象保存到String
json列中,而是为我的实体创建了一个新的HashMap字段entityAttributes
,以保留JSON对象.
So rather than saving the object to String
json column through toString()
, I created a new HashMap field entityAttributes
for my entity to persist a JSON object.
更新后的AuditLog实体
@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;
@Convert(converter = HashMapConverter.class)
private Map<String, Object> entityAttributes;
}
有关如何保存JSON对象的更多详细信息,可以通过以下链接查看: https://www.baeldung.com/hibernate-persist-json-object
More details on how to save the JSON object can be seen through this link: https://www.baeldung.com/hibernate-persist-json-object
此外,继续前进,实际上建议为您的实体创建自己的equals
,hashCode
和toString
方法,并且不要依赖Lombok等.
Also, moving forward, it really is recommended to create your own equals
, hashCode
and toString
method for your entities and don't rely on Lombok etc.
这篇关于保存对象的toString值时出现Stackoverflow错误-Java/Hibernate/Spring的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!