java - Hibernate中使用@OneToOne进行select时遇到java.lang.StackOverflowError

标签 java hibernate jpa spring-data-jpa one-to-one

当我在Hibernate中测试@OneToOne映射关系的一些东西时,我使用spring-data-jpa来查询。对于@OneToOne的双向关系,当我查询实体时,会出现两种情况:

  • 当两个表都没有数据时,没有错误;
  • 当数据存储在两个表中时,只是StackOverflowError;

接下来的相关代码:

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Integer personId;
    private String name;
    @OneToOne
    private IdCard idCard;
    // setter&getter
}

@Entity
public class IdCard {
    @Id
    @GeneratedValue
    private Integer number;
    private String area;

    @OneToOne(mappedBy="idCard")
    private Person person;
}

PersonDao:

@Transactional
@Repository
public interface PersonDao extends CrudRepository<Person, Integer> {
    public Person findByPersonId(Integer personId);
} 

IdCardDao:

@Transactional
@Repository
public interface IdCardDao extends CrudRepository<IdCard, Integer> {
    public IdCard findByNumber (Integer number);
} 

测试代码:

Person person = personDao.findByPersonId(1);
System.out.println(person);
IdCard idCard = idCardDao.findByNumber(123);
System.out.println(idCard);

我在网站上搜索了一些答案,找到了一个相关问题,StackOverFlowError while doing a One-To-One relationship in GAE Datastore using JPA 2.0

但我没有显式实例化实体,因此没有递归。使用jpa 2.1 有什么解决办法吗?

最佳答案

我在 @OneToOne 关系中遇到了同样的问题,java.lang.StackOverflowError: null 的解决方案是在关系的欠方使用 fetch LAZY

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Integer personId;
    private String name;
    @OneToOne (fetch = FetchType.LAZY)
    private IdCard idCard;
    // setter&getter
}

@Entity
public class IdCard {
    @Id
    @GeneratedValue
    private Integer number;
    private String area;

    @OneToOne(mappedBy="idCard")
    private Person person;
}

关于java - Hibernate中使用@OneToOne进行select时遇到java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37802385/

相关文章:

java - Jdatechooser内容

java - Tapestry 5 : 2 dependent select fields using zone

java - 谷歌应用管理 API : need to specify account user for service account?

java - 用点符号命名的 JPA 实体

java - 如何保存列表中的非常100条记录

java - 如何将 xhtml 表单中的数据插入到 netbeans 中的 Java DB 中?

java - HQL 查询执行时间过长

java - JBoss 准备语句太慢

java - 使用 EclipseLink 和 Querydsl 的自定义数据类型

java - 使用 Spring 和 Hibernate 时是否需要 persistence.xml?