保存对象的toString值时出现Stackoverflow错误-Java/Hibernate/Spring [英] Stackoverflow error when saving an Object's toString value - Java/Hibernate/Spring

查看:127
本文介绍了保存对象的toString值时出现Stackoverflow错误-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.

更新

  1. 我已经尝试通过Lombok的@Data批注对对象使用 toString() 方法
  2. 我也尝试使用String.valueOf(official)
  1. I already tried to used toString() method for objects through Lombok's @Data annotation
  2. 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()将我的实体的详细信息保存到一个字段中,这是一个问题.我确实尝试覆盖RegisteredProgramtoString()方法,该方法随后解决了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

此外,继续前进,实际上建议为您的实体创建自己的equalshashCodetoString方法,并且不要依赖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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆