【问题标题】:Java Jpa @GeneratedValue smart generation for both null and non-null values用于空值和非空值的 Java Jpa @GeneratedValue 智能生成
【发布时间】:2018-11-10 16:23:49
【问题描述】:

我的本​​地 postgres 数据库中有 10-15 个实体。 所有实体都包含一个整数类型的标识。请参阅下面的代码片段。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = false)
@NonNull
private Integer id;

我的 CRUD(T 是我的实体)类包含用于将新实体插入适当表的 create 方法

private final JpaRepository<T, Integer> jpaRepository;
private final EntityManager entityManager;
private final Class<T> clazz;

@Override
public T create(T entity) {
    return getJpaRepository().saveAndFlush(entity);
}

我正在努力实现下一个目标:

  1. 如果我调用 create 方法,其中实体包含 id 字段的某些值 (!= null),然后将其完全保存为该 id(未生成)。
  2. 如果我调用 create 方法,其中实体包含值 == null - 然后使用数据库提供的自动生成的 ID 创建它。

为什么我需要这个? 我正在尝试使用从 JSON 实体中获取的实体填充内存中的小型数据库,并使用相同的 id 保存它。

我的问题是注释@GeneratedValue(strategy = GenerationType.AUTO/SEQUENCE/TABLE/IDENTITY) 没有给我这样的东西。 如果我删除 GeneratedValue 注释,则 null 值将无法正确处理。

非常感谢您的建议。

添加评论折叠

【问题讨论】:

  • JPA 规范仅在 null 时不支持选择性生成值。您必须转到特定的 JPA 提供程序扩展来寻找该支持。我知道 DataNucleus JPA 允许这样做,但您没有说明您使用的是哪个 JPA 提供程序,因此无法进一步评论
  • @BillyFrost 提供者是休眠
  • 当你在它的文档中查看关于尝试做你想做的事情时?
  • @BillyFrost,类似于 EntityManager.persist(entity) 和刷新持久性上下文,但与 jpaRepository.saveAndFlush(entity) 不同,它会导致约束(分离实体)出现问题。
  • 这与价值产生有什么关系?你的问题是关于的,我建议你看看 Hibernate docs about

标签: java spring jpa spring-data-jpa identity


【解决方案1】:

Spring Data 并不神奇,如果您查看 saveAndFlush 方法的实现,或者更确切地说是它调用的 implementation of save, 你会看到它检查了if (entityInformation.isNew(entity))。 它如何检查isNew?只需检查 ID 是否为 NULL。

但是你可以直接使用实体管理器! merge 会做你想做的事。它可以将分离的实体带回托管状态并将其更改复制到持久化实体。但如果不存在持久化实体,它将简单地创建它。

并不是说您不想总是使用merge 而不是persist,这是有代价的。见How do persist and merge work in JPA

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2012-12-06
    • 2014-05-12
    • 2019-03-16
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多