2014-12-22 14 views
1

我有以下繼承鏈:不能由根類與JPA(休眠)連接繼承鏈負荷實體

@MappedSuperclass 
public abstract class AbstractEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    Long id; 
} 

@Entity 
@Table(name = "answers") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Answer extends AbstractEntity { 

} 

@Entity 
@Table(name = "chosen_answers") 
@PrimaryKeyJoinColumn 
public class ChosenAnswer extends Answer { 

    @ManyToOne(optional = false) 
    @NotNull 
    AnswerChoice answerChoice; 

} 

@Entity 
@Table(name = "free_text_answers") 
@PrimaryKeyJoinColumn 
public class FreeTextAnswer extends Answer { 

    String answerText; 

} 

我的數據庫(簡化)示例內容如下:

答案:

--id ---

| 100 |

free_text_answers:

--id ---- answer_text--

| 100 | 「一些文字」|

創建了從0​​到answers(id)的外鍵。 的問題是,實體管理器下面的語句返回null

em.find(Answer.class, 100l); // returns null 

雖然,100是用於存儲回答一個有效的身份證件。如果我查詢實體經理FreeTextAnswer的實例,我會得到預期的結果。

em.find(FreeTextAnswer.class, 100l) // returns stored entity 

奇怪的是,只要我查詢子類型的實體管理器,第一條語句也返回請求的實體。

這是預期的結果嗎?如果是的話,我如何設計我的繼承鏈來按我喜歡的方式工作?

我正在使用Spring Data Rest,並且我只通過RestRepository公開Answer實體,因此Spring Data Rest將實體管理器作爲預期實體調用Answer

回答

1

經過對生成的SQL語句的進一步調試後,我發現瞭解決該問題的解決方法。

正如您在下面的ER圖中看到的,Answer的一個子類與另一個實體具有OneToOne關係。這種關係的默認讀取類型是EAGER,這是問題所在。 只要我配置hibernate延遲加載這種關係,一切都按預期工作。

這是一個在冬眠的錯誤?

ER Diagram

+0

有意思。順便說一下,你用什麼工具爲圖表?是Intellij?thx –

+0

是的,我用IntelliJ創建了該圖。 但是,IntelliJ使用引擎蓋下的yFiles(如水印所示)。 –