2010-05-17 74 views
2

我確定這是一個問題,大多數答案都是「你爲什麼這樣做?」,但我想我會問。虛擬行在休眠表中

我有一個(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

我已經考慮了幾個方法可以做到這一點:

  1. 添加LoadEventListener其在User的任何載荷也沒發現什麼特殊返回「空對象」(和PreInsert/PreUpdateEventListener這vetos保存它們)。
  2. 將一個描述符列添加到ShoppingCart,並有一個映射User的子類,然後一個不使用單個表繼承映射它。
  3. (編輯)映射ManyToMany集合User s,在它不存在的情況下它將是一個空集合,而在另一個情況下爲一個集合的集合 - 這樣可以在沒有連接表的情況下工作嗎?

對這些或其他想法的評論?

回答

1

從休眠批註參考,你可以做一個

@ManyToOne 
@NotFound(action=NotFoundAction.IGNORE) 

忽略缺少記錄。

1

不知道它的外觀在註釋中,但在XML中有「未找到」參數:

<many-to-one name="user" class="com.example.User" column="userid" not-found="ignore" />