Q1。:是什麼使用有什麼區別:使用JPA @TableGenerator,@GeneratedValue和數據庫的序列ID Auto_Increment
A.
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
。
Q2。此處的鏈接(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作爲我的供應商;我必須按照上面的建議去做嗎?
Q3。如果乙從併發的問題而下降,並一個遭受一樣的嗎?
當你說:'我們面臨的挑戰是轉移此功能通過JPA.'使用,你指的是使用'@ GeneratedValue'的?所以我嘗試設置表'AUTO_INCREMENT'中的列,然後嘗試創建多個'Person'。第一個使用'id'正確創建的人開始是5,但是它爲2生成了一個例外。'在工作單元克隆中遇到空或零主鍵。我們不能只用'@ Id'註釋id,沒有'@ GeneratedValue',然後堅持實體對象,讓'AUTO_INCREMENT' PK數據庫來照顧它? – 2012-04-11 20:13:47
你可以顯示你的映射嗎?您應該使用'@ GeneratedValue'來告訴JPA實現該ID是否被處理。這裏有一個鏈接可以幫助您:http://www.developerscrappad.com/408/java/java-ee/ejb3-jpa-3-ways-of-generating-primary-key-through-generatedvalue/ – 2012-04-16 12:58:47