2016-06-14 49 views
0

時遇到java.lang.StackOverflowError當我在Hibernate中測試@OneToOne的映射關係時,我使用spring-data-jpa進行查詢。對於@OneToOne的雙向關係,當我查詢一個實體,它會發生兩種情況:在使用@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 任何解決方案?

+0

那麼你顯然有東西在你的代碼導致該但是您未能發佈異常消息和相關代碼意味着沒有人可以幫助您! –

+0

你做System.out.println(person);所以你在這些類中重寫toString()?你可能會在這裏遞歸調用。 –

+0

@Alan乾草,是的,我重寫的ToString(),如你所見:'@覆蓋 \t公共字符串的ToString(){ \t \t回報 「的人[PERSONID =」 + PERSONID + 「名字=」 +名字+」, idCard =「+ idCard +」]「; \t}' – Limengyang

回答

0

嘗試這樣,你可以在接收端一端地圖,爲OneToOne和多對一你不必提,

@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; 

private Person person; 
} 
+0

我使用'@ OneToOne'來建立一個以前的單向關係,它和上面提到的一樣好,但是當建立一個雙向關係會導致問題。 – Limengyang

+0

如果我是對的,循環引用是問題。你可以用休息客戶端運行該網址嗎?以便我們知道答案和問題。 – Guna