java - 在 hibernate 表中有虚拟行

标签 java hibernate nullable

我敢肯定这是一个大多数答案都是“你为什么要这样做?”的问题,但我想我会问。

我有一个(用户)表,其中绝大多数只有一个 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如果不存在呢?

我考虑过几种方法来做到这一点:

  1. 添加 LoadEventListener它在 User 的任何负载上返回特殊的“空对象”没有找到任何东西(和否决保存它们的 PreInsert/PreUpdateEventListener)。
  2. 将描述符列添加到 ShoppingCart并且有一个子类确实有 User映射,然后不使用单表继承映射。
  3. (编辑)映射 ManyToMany Collection User s,如果它不存在,它将是一个空集合,而在另一种情况下,它将是一个具有一个 id 的集合 - 这在没有连接表的情况下是否有效?

对这些或其他想法有什么意见吗?

最佳答案

从 Hibernate Annotation Reference,你可以做一个

@ManyToOne
@NotFound(action=NotFoundAction.IGNORE)

忽略丢失的记录。

关于java - 在 hibernate 表中有虚拟行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850508/

相关文章:

java - 将注释工作的结果传递给注释方法

java - 由 : org. hibernate.AnnotationException 引起:使用 @OneToMany 或 @ManyToMany 定位未映射的类:

java - Spring Jpa : change FetchType for entity

java - 是否需要覆盖注解 - Kotlin

WPF : Nullable ComboBox

java - 空分析注释包之间有什么区别?

java - 如何使用带有 Java 的 Selenium WebDriver 获取浏览器名称?

java - 使用注解@SpringBootApplication 进行配置

java - 在 GWT 中创建具有向下钻取功能的下拉菜单。

java - 使用 hibernate 返回错误的查询计数值