我確定這是一個問題,大多數答案都是「你爲什麼這樣做?」,但我想我會問。虛擬行在休眠表中
我有一個(Users)的表,其中絕大多數只有一個ID(因爲他們懶惰地創建用戶會話,從來沒有提供任何信息),並且不使用其餘的數據庫中的列。我決定刪除這些行以節省數據庫空間。有大量的表格帶有外鍵到表格,但只有兩個或三個可以引用這些假用戶。
對於很多這些表,我只是將映射切換爲映射userid
而不是User對象,但是如果它存在於表中,某些對象想要有整個User對象,否則爲null。
CREATE TABLE users AS (userid bigint);
CREATE TABLE shopping_carts AS (cartid bigint, userid bigint);
我看不出如何在Hibernate中映射它。
@Entity
class User {
@Id
long id;
}
@Entity
class ShoppingCart {
@Id
long id;
@Column("userid")
long userid; // Might not correspond to a user.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn("userid", insertable = false, updateable = false, nullable = true)
User user;
}
現在,這不返回null,但拋出ObjectNotFoundException
如果USER_ID指向不存在的用戶。即使您添加@Fetch(FetchMode.JOIN)
。如果它不存在,有什麼辦法可以將其視爲null
?
我已經考慮了幾個方法可以做到這一點:
- 添加
LoadEventListener
其在User
的任何載荷也沒發現什麼特殊返回「空對象」(和PreInsert/PreUpdateEventListener
這vetos保存它們)。 - 將一個描述符列添加到
ShoppingCart
,並有一個映射User
的子類,然後一個不使用單個表繼承映射它。 - (編輯)映射
ManyToMany
集合User
s,在它不存在的情況下它將是一個空集合,而在另一個情況下爲一個集合的集合 - 這樣可以在沒有連接表的情況下工作嗎?
對這些或其他想法的評論?