当我在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/