问题标签 [id-generation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Hibernate:为列表中的相同对象引用生成不同(唯一)ID
问题
当列表中有两次相同的对象引用时,是否可以在 Hibernate 中进行插入,我想同时插入它们并且 ID 必须是唯一的?
背景
我正在使用random-beans生成一个Person
具有 type 列表的随机对象House
。问题是 random-beans 不会每次都创建一个新的 house 对象,它有时也会使用现有的引用。在这种情况下,相同的房屋对象引用可以在人员列表中出现两次。但不管随机beans如何,我都想处理必须在Hibernate的同一个事务中提交的新对象的多个引用。
可能通过在 处分配 ID 是不可能的Session.save(Object obj)
,因为列表中仍然引用了相同的对象。如果对此没有简单的解决方案,我也会感谢一种在保存或提交时删除重复对象的方法。请注意,将 List 更改为 Set 并不能解决问题,因为相同的引用可以在不同的列表中。
例子
该数据库是 MySQL 数据库。
主要的
人
房子
java - 为什么saveandflush后实体中的id为null,而数据库中的id不为null?
我将最新的Spring Boot与Spring Data JPA和Hibernate一起使用。使用的数据库是Oracle 11G。几天来我一直在寻找解决方案,但没有任何效果。我努力检索数据库中新插入(成功)的实体的 id。我使用序列和触发器。例如
实体:
触发:
序列:
查询在控制器中执行。例如
findAll {"id":81,"addressLine":"aa","addressLine2":"a","city":"a","postalCode":"a"} 之后的结果
但这是 System.out.println(saved); 之后的对象。
存储库:
我怀疑会话存在问题,数据尚未提交。我对吗?如何解决?谢谢!
spring - Spring Data CrudRepository 自定义 ID 生成器
我正在使用 spring boot(1.4)、spring data 和 jpa。并使用@Repository
(CrudRepository) 我的表/实体之一,即 ID 列,我想生成自定义字符串。从一些特定的字符串加上创建数据和时间开始,并以 db 中的下一个值结束。所以在这里我不能使用@TableGenerator
,我需要一些原生查询,比如“select nextvalue”
有没有更好的方法可以实现这一点。
spring-boot - 使用 JPA 的 Spring-Boot 不保留 ID
我需要在我的数据库中插入一条记录,但在某些情况下我需要传递 ID,但是当我手动插入我的 id 时,spring-boot 不会使用此 ID 保存,spring-boot 会从序列中获得一个新的
这是我的实体
这是我要保存的代码:
而是用 id 12323 保存,他从我的序列中得到了下一个
grails - 对于没有本机自动增量功能的数据库,Grails (GORM) 中的默认 ID 生成策略是什么
我正在使用带有 oracle 的 grails 2.4。现在,如果我想在数据库表中创建一行,我只需在 grails 中创建一个域对象并调用 save() 方法。不过,我目前没有将任何 id 传递给该对象。
这将创建一行并自动为数据库中的 id 列设置一个 id,因为我已经在域对象的映射器中指定了 id 列
根据Grails 文档,grails 默认使用本机(数据库内置)id 生成器。
我的问题是,如果我将数据库切换到 h2 而不是 oracle(对于不同的环境),grails 将如何管理数据库的 id 列?
目前,当我使用 Bootstrap.groovy 创建一些默认数据时,我收到一条错误消息,指出“STATE_ID”(对于 h2 数据库)中不允许出现“NULL”。它适用于甲骨文。
有没有办法告诉 grails 仅在数据库没有使用默认生成器时才使用某些特定的生成器?
sql-server - 在持久化之前针对数据库检查 @Id 列值
下面是我的主要列定义,
我有两个应用程序服务器连接到一个数据库。当第一个应用程序服务器插入大约 10 条记录时,主键值(entityId)将为 10,当第二个应用程序服务器插入大约 15 条记录时,主键值(entityId)将为 25。到目前为止很好。
现在,当第一个应用程序服务器尝试插入一些记录时,entityId 从 11 而不是 26 开始,导致Violation of PRIMARY KEY constraint。预计 entityId 应从 26 开始。
两个应用程序服务器都在单独的 JVM 中运行。
请分享您在处理这种情况时的投入。
提前致谢..
jpa - JPA 自动生成的继承实体的 id 未按照超类中序列生成器中的定义递增
我对持久继承的实体有一个奇怪的自动生成 id 行为。我有一个带有序列生成器的人员实体,它以 4 递增,并且工作正常。我有另外两个实体 Client 和 Agent,它们继承 Person 并将人员 ID 用作 pk。我有一个包含 3 个连接实体的策略实体:2 个客户端和代理。当我坚持策略[entity manager]persist(policy)它调用
对于第一个客户端,并按照假设增加 id,但是在持久化其他 2 个实体时:客户端和代理,它只调用:
并按预期增加 1 而不是 4。我无法理解这种行为。我在这里错过了什么?
我使用: JPA EclipseLink和 Postgresql
客户端和代理类:
具有联合关系的策略类:
我的架构:
坚持政策后:
我在日志中收到:
但是自动生成的 id 应该是: 50, 54, 58。
在插入之前我看到的数据库序列中:
当前值:46 下一个值:50
插入后:
当前值:50 下一个值:54
在下一个持久化中,我收到以下 ID:52、51、50。
解决方案:
将 allocationSize 更改为 1 是固定的,当设置此参数表示缓存时,下一个值将增加多少次,直到它将从数据库中获取下一个值,在 javaee api 文档中,此参数表示递增,但它的工作方式不同不知道为什么。
java - 如何使用相同的自定义 id 生成器统一多个实体的 @GenericGenerator 声明?
我的项目中有许多实体使用相同的自定义IdentifierGenerator
生成@Id
使用SpringDataJPA/Hibernate
.
一个示例实体;
但我不想@GenericGenerator
为每个实体的每个 id 字段重复声明。有没有办法隐藏这个包含丑陋的硬编码完整类名的注释?
post scriptum
我以前使用包含@MappedSuperClass
的,但由于一些技术原因,我不得不放弃使用这样的超类。显然,这是解决这个问题的最简单方法。BaseEntity
id
id-generation - 从 16 位数字生成 ID
是否有任何可能的简单方法/方式将 16 位字母数字生成/加密为 6 到 8 位字母数字代码。16 位数字将有数百万种可能的组合,因此加密的 6-8 字母数字数字必须是唯一的。提前感谢您的建议。