我敢肯定这是一个大多数答案都是“你为什么要这样做?”的问题,但我想我会问。
我有一个(用户)表,其中绝大多数只有一个 ID(因为它们是懒惰地为从未提供任何信息的 session 创建用户),并且不使用其余的数据库中的列。我决定只删除这些行以节省数据库空间。有很多带有表外键的表,但只有两三个可以引用这些假用户。
对于很多这样的表,我只是将映射切换为映射 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
)。 - 将描述符列添加到
ShoppingCart
并且有一个子类确实有User
映射,然后不使用单表继承映射。 - (编辑)映射
ManyToMany
CollectionUser
s,如果它不存在,它将是一个空集合,而在另一种情况下,它将是一个具有一个 id 的集合 - 这在没有连接表的情况下是否有效?
对这些或其他想法有什么意见吗?
最佳答案
从 Hibernate Annotation Reference,你可以做一个
@ManyToOne
@NotFound(action=NotFoundAction.IGNORE)
忽略丢失的记录。
关于java - 在 hibernate 表中有虚拟行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850508/