![](/img/trans.png)
[英]MapStruct: How can I do filter to fields which I want and don't want to mapping?
[英]How to do OnetoOne mapping and I don't want to save data to its related table in hibernate
我有 2 張桌子、車輛和設備
我想在 hibernate 中執行發布請求,並且不想將數據保存在其相應的設備表中。 但我想獲取設備表的現有 ID 並存儲到車輛表中。 誰能幫我解決這個問題?
class vehicle{
@ID
@GeneratedValue(strategy= GeneratedType.IDENTITY)
int id;
@OnetoOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE})
private Device deviceid;
}```
我不明白在這種情況下“執行發布請求”是什么意思,但您應該注意“OneToOne”注釋的屬性。 如您所見,您指定了
@OnetoOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE})
級聯屬性有 javadoc
(可選)必須級聯到關聯目標的操作。 默認情況下,沒有操作被級聯。
在您的情況下,對“車輛”實例的任何指定操作都將觸發“設備”實例的更新(如果有必要)。
默認情況下,“OneToOne”注釋也有 FetchType.EAGER。
(可選)關聯是應該延遲加載還是必須急切獲取。 EAGER 策略是對持久性提供程序運行時的要求,即必須急切地獲取關聯實體。 LAZY 策略是對持久性提供程序運行時的提示。
這意味着當您從數據庫中獲取“車輛”實體時,您將獲取“設備”實體。 所以 hibernate 會做 2 次選擇,就像這樣:
select * from vehicle where id = :id
select * from device where device_id = :id
說說 hibernate map 如何分類到數據庫表。 Hibernate可以把map這個結構加到2個表中。
create vehicle (
id
device_id
)
create device (
id
vehicle_id # if field "@OneToOne private Vehicle vehicle;" specified in "Device" class
)
最后,如果您只想在“Vehicle”class 中使用“deviceId”(而不是 object“Device”),您應該考慮刪除 @OneToOne 並使用類似
private Integer deviceId; // Without annotations
並手動管理。 但在這種情況下,不要忘記為關系“vehicle.device_id 和 device.id”創建外鍵約束,它可以幫助您避免數據不一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.