簡體   English   中英

使用中間表(中間實體)與兩個ManyToOne進行JPA映射

[英]JPA mapping with two ManyToOne using an intermediary table (middle entity)

我正在嘗試使用JoinTable設置JPA映射,當Hibernate(我的JPA實現)正在執行查詢時,它似乎被忽略了。

解釋用例

每次用戶訪問我的應用頁面時,我都會在USAGE_LOG表中插入一行(帶有用戶ID和頁面ID)。

每個頁面都與一個類別(例如:設置,訂單,項目,新聞...)和一個類型(例如創建,更新,顯示,刪除)相關。

因此,我有某種中間實體表,該表將頁面鏈接到:類別+類型。 像三元組一樣:(頁面,類別,類型)

我的表結構

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",
        joinColumns=@JoinColumn(name="ID", referencedColumnName="USER_ACTION_ID"),
        inverseJoinColumns=@JoinColumn(name="ACTION_CATEGORY_ID", referencedColumnName="ID"))
@Getter @Setter
private ActionCategory actionCategory;

@ManyToOne
@JoinTable(name="action",
    joinColumns=@JoinColumn(name="ID", referencedColumnName="USER_ACTION_ID"),
    inverseJoinColumns=@JoinColumn(name="ACTION_TYPE_ID", referencedColumnName="ID"))
@Getter @Setter
private ActionType actionType;

(我將Lombok用於@Getter和@Setter)

編譯此映射,但是當我嘗試獲取數據時,出現以下異常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“ usagelogpa0_.actionCategory”

實際上,Hibernate查詢是:

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”和“ actionType”)

這不是我期望的,Hibernate應該加入。

您知道我做錯了什么嗎?

謝謝 !

經過大量調查,我發現:

  • 它沒有按預期工作,因為我將@ManyToOne和@JoinTable批注放在屬性級別。 我手動創建了一個吸氣劑,並在上面加上了注釋,然后將它們考慮在內
  • 它仍然無法正常運行,因為Hibernate在運行時未在USAGE_LOG_PAGE表上找到“ USER_ACTION_ID”列。 由於某種原因(我找不到),該列不在可用字段中。 在實體“ UsageLogPage”中添加字段“ usage_action_id”時,它找到了屬性,但是由於USAGE_ACTION_ID不是主鍵而拒絕創建映射。

最后,即使我不能更改數據庫,也可以更改對象模型。

因此,我創建了中間實體“ UserAction”,將其與UsageLogPage實體上的ManyToOne綁定,從UsageLogPage中刪除了屬性“ actionCategory”和“ actionType”,並將它們作為ManyToOne添加到了新的UserAction實體中。

如果您有一個表充當2個不同的ManyToOne關系的中間實體,那么最好的解決方案是在對象模型中創建中間實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM