2010-05-17 80 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" />