阅读 JPA Mini Book 中的段落时感到困惑
Posted
技术标签:
【中文标题】阅读 JPA Mini Book 中的段落时感到困惑【英文标题】:Confusion reading a passage in JPA Mini Book 【发布时间】:2018-02-07 09:30:17 【问题描述】:我在JPA Mini Book看过,这段话:
"allocationSize = 53" 表示 JPA 将存储的 id 数量 在缓存中。像这样工作:当应用程序启动时,JPA 将 在内存中分配指定数量的 id 并将共享这些 每个新的持久实体的值。在上面的代码中,ID 将 从 10 (initialValue) 到 63 (initialValue + allocationSize)。 当分配的 id 数量结束时,JPA 将从 数据库并在内存中分配 53 个以上的 ID。这种分配行为 ids into memory 是优化服务器内存的好方法,因为 JPA 不需要在每次插入时触发数据库,以便 就像使用 @Identity 方法一样获取创建的 id。
问题:
-
看完
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 不会调用数据库,而另一个用户正在更新相同的行,看到旧数据,这不是问题吗?我错过了什么?请向我解释一下。提前致谢。
【问题讨论】:
【参考方案1】:1- 这是任何提供商都必须遵守的 JPA 规范,hibernate 或 eclipse 链接或任何其他 jpa 实现(我不知道你提到的那些)
2- 我们有办法在插入时自动生成实体 id(对应于表主键),1 - AUTO:表示自动递增,2 - SEQUENCE_GENERATOR:使用 DB 序列 .next(),3 - TABLE_GENERATOR :类似于序列,但使用具有 2 列的表,一个是实体名称(或相应的名称),另一个是最大 id 值,4-IDENTITY:它使用某些数据库中存在的表属性,称为标识符列.. .. 现在回到您的问题,当您使用 allocationSize = 53 并使用序列或表生成器插入新记录时,序列或表中的值中的值将增加该值 53(因此变为 63)并且然后,jpa 将能够插入 id 为 10 -> 63 的实体,而无需再次访问数据库
3-关于您的一致性问题,所有主题都是关于插入不更新的新行和关于 IDENTITY 的,分配大小仅适用于序列和表生成器,因此在 IDENTIITY 的情况下,没有缓存
【讨论】:
对于 1- 似乎您没有理解我的问题,对于 2- 我无法理解您写的内容,对于 3- 您能否提供一个链接来备份您的说法 1-你能解释更多吗 2-我编辑了答案,请再次检查 3-参考 Pro JPA 2 或 JPA 规范以上是关于阅读 JPA Mini Book 中的段落时感到困惑的主要内容,如果未能解决你的问题,请参考以下文章