使用 JPA @TableGenerator 的序列 id 与数据库Auto_Increment之间的区别是什么:@GeneratedValue
Q1.: 在数据库中应用序列 Id 有什么区别
一个。
CREATE TABLE Person
(
id long NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (id)
)
对
B.
@Entity
public class Person {
@Id
@TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
@GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
private long id;
...
}
我的系统是高度并发的。由于我的数据库是Microsoft SQL服务器,我认为它不支持,所以我必须留下来,这容易出现并发问题。@SequenceGenerator
@TableGenerator
问题 2.这里的这个链接(http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing)表明B可能会受到并发问题的困扰,但我不明白提出的解决方案。如果有人能向我解释如何避免B的并发问题,我将不胜感激。以下是他们的解决方案的一个片段:
If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.
Q2.1: 我们在这里谈论的分配大小是多少?我应该做还是?allocationSize=10
allocationSize=100
Some JPA providers use a separate (non-JTA) connection to allocate the sequence ids in, avoiding or limiting this issue. In this case, if you use a JTA data-source connection, it is important to also include a non-JTA data-source connection in your persistence.xml.
Q2.2: 我使用 EclipseLink 作为我的提供者;我必须按照上面的建议去做吗?
问题 3.如果 B 存在并发问题,A 是否也存在相同的问题?