我确定这是一个问题,大多数答案都是“你为什么这样做?”,但我想我会问。虚拟行在休眠表中
我有一个(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,在它不存在的情况下它将是一个空集合,而在另一个情况下为一个集合的集合 - 这样可以在没有连接表的情况下工作吗?
对这些或其他想法的评论?