gpt4 book ai didi

Java Jpa @GeneratedValue 智能生成空值和非空值

转载 作者:行者123 更新时间:2023-12-04 11:34:15 24 4
gpt4 key购买 nike

我的本地 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);
}

我正在努力实现下一个目标:
  • 如果我调用 create 方法,其中实体包含 id 字段的一些值( != null ),然后将其与该 id 完全保存(未生成)。
  • 如果我调用 create 方法,其中实体包含值 == null - 然后使用自动生成的 id 作为数据库提供创建它。

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

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

    我将非常感谢您的建议。

    添加评论收起

    最佳答案

    Spring Data 不是魔术,如果您查看 saveAndFlush 的实现方法,或者更确切地说是在 implementation of save 它称之为,
    你会看到它检查 if (entityInformation.isNew(entity)) .
    怎么查isNew ?只需检查 ID 是否为 NULL。
    但是你可以直接使用实体管理器! merge会做你想做的。它用于将分离的实体带回托管状态并将其更改复制到持久化实体。但是如果不存在持久化实体,它将简单地创建它。
    并不是你不想总是使用 merge而不是 persist ,这是有代价的。见 How do persist and merge work in JPA

    关于Java Jpa @GeneratedValue 智能生成空值和非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50627965/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com