[英]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應該加入。
您知道我做錯了什么嗎?
謝謝 !
經過大量調查,我發現:
最后,即使我不能更改數據庫,也可以更改對象模型。
因此,我創建了中間實體“ UserAction”,將其與UsageLogPage實體上的ManyToOne綁定,從UsageLogPage中刪除了屬性“ actionCategory”和“ actionType”,並將它們作為ManyToOne添加到了新的UserAction實體中。
如果您有一個表充當2個不同的ManyToOne關系的中間實體,那么最好的解決方案是在對象模型中創建中間實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.