2017-05-24 24 views
0

我使用JPA/EclipseLink的三個實體:的EclipseLink在子類中查詢使用不正確的表名,如果繼承類型是單表

@Entity(name = "Sharing") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public class AbstractSharingEntity extends AbstractEntity { 

@Entity(name = "InternalSharing") 
public class InternalSharingEntity extends AbstractSharingEntity { 

@Entity(name = "ExternalSharing") 
public class ExternalSharingEntity extends AbstractSharingEntity { 

如果我創建AbstractSharingEntity(」 FROM共享一個類型的查詢...... 。「),EclipseLink使用指定的實體名稱創建正確的查詢。但如果我爲兩個子類之一(例如「... FROM InternalSharing ...」)創建了一個類型化查詢,EclipseLink將使用類名作爲表名而不是使用實體名來創建錯誤的查詢。這會導致以下錯誤:

java.sql.SQLSyntaxErrorException: Table 'db.ABSTRACTSHARINGENTITY' doesn't exist 

我犯了什麼錯誤,這是預期的行爲嗎?如何在不更改類名稱/刪除不同實體名稱的情況下爲子類創建有效查詢?

+0

打開,看到的EclipseLink說什麼,當處理您的持久性單元。 – Chris

回答

0

您的期望是正確的恕我直言。當沒有指定表名時,默認表名稱爲「entityName」,並且由於您覆蓋了「Abstract」類的實體名稱,因此使用的表應該是SHARING。而且由於它具有繼承,所以也應該將它用於子類。

所有這些查詢應生成表單

"SELECT ... FROM SHARING ..." 

的查詢擡起你的JPA提供者的錯誤。

注意:這假定AbstractEntity而不是 JPA實體。

你會的,當然,需要對模型鑑別,還你的「抽象」類可能應該是在記錄abstract