一对多关系导致休眠中的堆栈溢出

Dimitris:

我建立了一对多的关系。尽管当我从多个对象到另一端通过id查询对象时,一切似乎都很好,但joined列会引发stackoverflow异常,但我无法弄清楚它为什么会发生。我大致按照本教程进行操作

玩家实体

@Entity
@Data
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "player_id", updatable = false, unique = true, nullable = false)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "num")
    private int num;
    @Column(name = "position")
    private String position;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;
}

团队实体

@Entity
@Data
public class Team {
    @Id
    @Column(name="team_id", updatable = false, unique = true)
    private String id;
    @Column(name = "name")
    private String name;
    @OneToMany(mappedBy = "team")
    private List<Player> players;
}

我的玩家资料库

@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {
    Optional<Player> findById(Long id);
}

import.sql中的数据库条目

insert into Team (team_id,name) values('Barcelona','Barcelona');
insert into Player (name,num,position,team_id) values('Andreas Inniesta', 8, 'Midfielder', 'Barcelona');
insert into Player (name,num,position,team_id) values('Lionel Messi', 10, 'Forward', 'Barcelona');

H2控制台上的播放器表 在此处输入图片说明

这是例外

java.lang.StackOverflowError: null
        at java.lang.StringBuilder.append(StringBuilder.java:136) ~[na:1.8.0_121]
        at mypackage.entity.Player.toString(Player.java:8) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_121]
        at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Team.toString(Team.java:9) ~[classes!/:1.0-SNAPSHOT]
        at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:84) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at mypackage.entity.Team_$$_jvst2b7_1.toString(Team_$$_jvst2b7_1.java) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Player.toString(Player.java:8) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_121]
        at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Team.toString(Team.java:9) ~[classes!/:1.0-SNAPSHOT]
        at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:84) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at mypackage.entity.Team_$$_jvst2b7_1.toString(Team_$$_jvst2b7_1.java) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Player.toString(Player.java:8) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_121]
        at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Team.toString(Team.java:9) ~[classes!/:1.0-SNAPSHOT]
        at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:84) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at mypackage.entity.Team_$$_jvst2b7_1.toString(Team_$$_jvst2b7_1.java) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Player.toString(Player.java:8) ~[classes!/:1.0-SNAPSHOT]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_121]
        at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
        at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
        at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
        at mypackage.entity.Team.toString(Team.java:9) ~[classes!/:1.0-SNAPSHOT]
        at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) ~[na:na]

例外的根源

at mypackage.entity.Team.toString(Team.java:9) ~[classes!/:1.0-SNAPSHOT]
at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:84) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
at mypackage.entity.Team_$$_jvst2b7_1.toString(Team_$$_jvst2b7_1.java) ~[classes!/:1.0-SNAPSHOT]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
at mypackage.entity.Player.toString(Player.java:8) ~[classes!/:1.0-SNAPSHOT]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_121]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_121]
at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_121]
at mypackage.entity.Team.toString(Team.java:9) ~[classes!/:1.0-SNAPSHOT]
at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) ~[na:na]

进一步调试该错误表明,在连接的列上某种内部转换为字符串失败。 在此处输入图片说明

亚历克斯:

如我所见,您正在使用Lombok

您认为您不是在创建toString方法,但Lombok事实并非如此。@Data注释将使得生成的toString方法。

Lombok文档:

@Data是捆绑的特征的方便快捷方式注释@ToString@EqualsAndHashCode@Getter/ @Setter@RequiredArgsConstructor在一起:即,@Data产生所有通常与简单的POJO(普通旧式Java对象)和豆类相关的样板:吸气剂对于所有字段,设置器为所有非final字段,以及涉及该类字段的适当的toString,equals和hashCode实现,以及一个构造函数,该构造函数初始化所有final字段以及所有未标记有的初始值设定项的非final字段,@NonNull以确保字段永远不会为空。

如此为您Lombok创建的toString方法将导致无限递归。

您可以通过以下方式修复它:

@Data
@ToString(exclude = "players")
public class Team {
   // ...
}

要么:

@Data
public class Team {
    @OneToMany(mappedBy = "team")
    @ToString.Exclude
    private List<Player> players;
}

值得一提的是,如果您仍需要playersTeamtoString表示形式中包含它,请尝试反汇编@Data注释并仅添加真正需要的部分。然后定义自己的toString方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章