簡體   English   中英

如何進行 OnetoOne 映射,我不想將數據保存到 hibernate 中的相關表中

[英]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.

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