2017-08-02 16 views
0

我想用JoinTable設置JPA映射,並且它在Hibernate(我的JPA實現)正在執行查詢時似乎被忽略。使用中間表(中間實體)的兩個ManyToOne的JPA映射

要講解使用情況

用戶每次得到我的應用程序的頁面,我插在USAGE_LOG表中的一行(與用戶的ID和頁面ID)。每個頁面與一個類別(例如:settings,orders,items,news ...)和一個類型(例如創建,更新,顯示,刪除)相關。

所以,我有一種中間實體表,即將頁面鏈接到:一個類別+一個類型。就像三重:(頁,類別,類型)

我的表結構

table USAGE_LOG (for information only, this one works well) 
    ID PrimaryKey 
    USER_ID Foreign key to column ID of table USER 
    USAGE_LOG_PAGE_ID Foreign key to column ID of table USER_LOG_PAGE 

table USAGE_LOG_PAGE 
    ID PrimaryKey 
    URL VARCHAR 
    USER_ACTION_ID Foreign key to column ID of table USER_ACTION 

table USER_ACTION 
    ID PrimaryKey 
    ACTION_CATEGORY_ID Foreign key to column ID of table ACTION_CATEGORY 
    ACTION_TYPE_ID Foreign key to column ID of table ACTION_CATEGORY 

table ACTION_CATEGORY 
    ID PrimaryKey 
    NAME VARCHAR 

table ACTION_TYPE 
    ID PrimaryKey 
    NAME VARCHAR 

所以USER_ACTION表是一個聯合表的特殊性在於它一USAGE_LOG_PAGE鏈接到ACTION_CATEGORY並在ACTION_TYPE同一時間。

此外,我可以有幾個USAGE_LOG_PAGE鏈接到相同的ACTION_CATEGORY和ACTION_TYPE。

不幸的是,我無法更改數據庫結構(它是遺留代碼)。

我曾嘗試對實體 「UsageLogPage」

@ManyToOne 
@JoinTable(name="action", 
     [email protected](name="ID", referencedColumnName="USER_ACTION_ID"), 
     [email protected](name="ACTION_CATEGORY_ID", referencedColumnName="ID")) 
@Getter @Setter 
private ActionCategory actionCategory; 

@ManyToOne 
@JoinTable(name="action", 
    [email protected](name="ID", referencedColumnName="USER_ACTION_ID"), 
    [email protected](name="ACTION_TYPE_ID", referencedColumnName="ID")) 
@Getter @Setter 
private ActionType actionType; 

(我用的龍目島的@Getter和@Setter)

這種映射編譯,但是當我試圖讓下面的Mappping數據,我有以下異常: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:'字段列表'中的未知列'usagelogpa0_.actionCategory'

事實上,Hiberna TE查詢:

select usagelogpa0_.ID as ID1_80_0_, 
    usagelogpa0_.actionCategory as actionCa2_80_0_, 
    usagelogpa0_.actionType as actionTy3_80_0_, 
    usagelogpa0_.URL as URL5_80_0_ 
from usage_log_page usagelogpa0_ 
where usagelogpa0_.ID=? 

(關鍵部分是「actionCategory」,並在選擇「操作類型」)

這不是我所期望時,Hibernate應該做一個連接。

你知道我做錯了什麼嗎?

謝謝!

回答

0

經過大量的調查,我發現:

  • 如預期,因爲我把@ManyToOne和@JoinTable註解在屬性級別它不工作。我手工創建了一個getter,並在其上註釋了它們,並將它們考慮在內
  • 它仍然無法正常工作,因爲Hibernate在運行時未在USAGE_LOG_PAGE表上找到列「USER_ACTION_ID」。由於某種原因(我沒有找到),這一欄不在可用字段中。在實體「UsageLogPage」中添加字段「usage_action_id」時,它找到該屬性,但拒絕創建映射,因爲USAGE_ACTION_ID不是主鍵。

最後,即使我無法更改數據庫,我可以更改對象模型。

所以我創建了中間實體「UserAction」,將其與UsageLogPage實體上的ManyToOne綁定,從UsageLogPage中刪除屬性「actionCategory」和「actionType」,並將它們添加爲新的UserAction實體中的ManyToOne。

如果你有一個表作爲2個不同ManyToOne關係的中間實體,最好的解決方案是在你的對象模型中創建中間實體。