我在JPA Mini Book中读到了这段话:
" allocationSize = 53"表示JPA将存储的ID数量 在缓存中。这样工作:当应用程序启动时,JPA会 在内存中分配指定数量的ID并将共享这些 每个新持久化实体的值。在上面的代码中,id会 从10(initialValue)到63(initialValue + allocationSize)。 当分配的ID数量结束时,JPA将从中请求 数据库并在内存中分配53个ID。这种分配行为 因为,内存中的ID是优化服务器内存的好方法 JPA不需要为每个插入触发数据库 获取创建的ID就像使用@Identity方法一样。
问题:
when the application is started JPA will allocate in memory the specified number of ids..
后,我有反应,他们谈论哪个JPA? NetBeans
或glassfish
的JPA? EAR是否包含JPA?When the number of allocated ids ends JPA will request from the database and allocate in memory 53 more ids
中,JPA会从数据库中请求什么?since JPA will not need to trigger the database with every insert so as to get the created id just like with the @Identity approach
,使用IDENTITY
表示JPA不会使用CACHE
而使用SEQUENCE
表示JPA会使用CACHE
吗?没有使用这样的策略(SEQUENCE)意味着我们的数据存在一致性风险?假设我们想要更新20行,这样JPA就不会调用DB,而另一个用户正在更新看到旧数据的相同行,这不是一个问题吗?我错过了什么?请向我解释一下。提前谢谢。答案 0 :(得分:0)
1-这是JPA规范,任何提供商都必须遵守它,hibernate或eclipse链接或任何其他jpa实现(我不知道你提到的那些)
2-我们有方法在插入时自动生成实体ID(对应于表主键),1 - AUTO:表示自动递增,2 - SEQUENCE_GENERATOR:使用DB序列.next(),3 - TABLE_GENERATOR :类似于序列,但使用一个包含2列的表,一个是实体名称(或相应的名称),另一个是max id值,4-IDENTITY:它使用一些名为identifier列的数据库中存在的表属性。 ..现在回到你的问题,当你使用allocationSize = 53插入一个新记录并使用序列或表生成器时,序列或表中的值中的值将增加该值53(因此变为63)并且然后,jpa将能够插入具有ID 10 - >的实体。 63没有再次击中DB
3-关于你的一致性问题,所有主题都是关于插入新行而不是更新和关于IDENTITY,分配大小仅适用于序列和表生成器,所以在IDENTIITY的情况下,没有缓存