我是Hibernate的新手,當談到編寫映射文件並理解映射不一定用於POJO的實體的最佳實踐時。Hibernate查詢返回多對多DB關係的結果,而不需要映射關係
我在我的數據庫中定義了role
和message
之間的多對多關係。這個想法是一個角色(思考用戶組)可以在這個應用程序中被分配消息,並且一個消息可以被分配給許多角色。這是爲了嚮應用程序中的用戶組傳遞消息。
我不一定希望我的對象模型直接反映這種多對多的關係。例如,我不一定希望我的角色對象知道有關消息的任何信息,並且我不希望消息擁有角色集合(儘管如果看起來這是最好的,我可能會對此產生影響)。我的想法是,在這種情況下,我寧願將採取
- 裝載消息的服務:一組角色,並返回適用的信息
- 保存的消息:一組或角色和消息其所適用
我現在有兩個Message
和Role
映射,但是我做不有映射鏈接表message_role
。
所以,我有幾個有關如何爲信息查詢角色問題:
- 我應該還是創建鏈接表的映射?我相信我已經看到,我不必在hibernate映射文件中的類元素上聲明一個名稱屬性;聲明映射而不必將其映射到POJO(而是給它一個實體名稱)。我開始沿着這條路走下去,但不確定如何映射表,因爲表中實際上只包含一個組合鍵,而主鍵中的每一列都是鏈接表中的外鍵。
所以,因爲我不能確定的是,我居然現在使用一個命名查詢,看起來像這樣:
< SQL查詢的名稱= 「loadRoleMessages」>
<![CDATA[ select m.* from message m right join message_role mr on m.message_id=mr.message_id where m.effective_date <= :date and m.expiration_date >= :date and mr.role_id in (:roleIds) ]]>
</SQL - 查詢>
(對不起,無法得到的格式,包括出於某種原因,SQL查詢標籤)
這實際上是工作,但我得到List<Object[]>
從我的查詢而不是List<Message>
返回。 Object[]
代表正在返回的列。我明白這是因爲查詢沒有引用消息實體,因此Hibernate不知道基於查詢結果創建消息對象。從我發現的情況來看,似乎不可能將一個實體加入到HQL中的非實體表中。(1)是否存在一個首選/最佳實踐來映射兩個實體(角色/消息),這些實體在數據庫中是相關的(多對多),但是我不一定希望它們在POJO中被映射。如果沒有,我堅持使用我的SQL查詢,然後在這個查詢的情況下手動構建消息POJO?