Q1.: Jaka jest różnica między zastosowaniem sekwencji ID w bazie danych przy użyciuJaka jest różnica między: id sekwencji przy użyciu JPA @TableGenerator, @GeneratedValue vs database Auto_Increment
A.
CREATE TABLE Person
(
id long NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (id)
)
kontra
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;
...
}
Mój system jest wysoce współbieżne. Ponieważ mój DB jest serwerem Microsoft SQL, nie sądzę, że obsługuje on @SequenceGenerator
, więc muszę pozostać przy @TableGenerator
, który jest podatny na problemy współbieżności.
Q2. Ten odnośnik tutaj (http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing) sugeruje, że B może cierpieć z powodu problemów z współbieżnością, ale nie rozumiem proponowanego rozwiązania. Byłbym bardzo wdzięczny, gdyby ktoś mógł mi wyjaśnić, jak uniknąć problemów z współbieżnością z B. Oto fragment ich rozwiązania:
If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.
Q2.1: Ile wielkość alokacji mówimy tutaj? Czy powinienem wykonać allocationSize=10
lub 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: Używam EclipseLink jako mojego dostawcy; czy muszę zrobić to, co sugeruje powyżej?
Q3. Jeśli wystąpią problemy z współbieżnością, B cierpi na to samo?
Kiedy powiedziałeś: "Wyzwaniem jest przeniesienie tej funkcji, która ma być używana przez WZP.", Czy odnosisz się do użycia '@ GeneratedValue'? Tak więc próbuję ustawić kolumnę w tabeli 'AUTO_INCREMENT', a następnie spróbuję stworzyć wielokrotność' Osoba'. Pierwsza osoba tworzy poprawnie z "id" zaczyna się na 5, ale generuje wyjątek dla osoby 2. 'Null lub zero klucz podstawowy napotkany w jednostce pracy clone. Czy nie możemy po prostu zanotować identyfikatora za pomocą '@ Id', bez' @ GeneratedValue', a następnie utrzymywać obiekt encji i pozwolić, aby baza danych z 'AUTO_INCREMENT' PK zajmowała się tym? –
Czy możesz pokazać swoje mapowanie? Powinieneś użyć '@ GeneratedValue', aby powiedzieć implementacji JPA, że dbano o identyfikator. Oto jeden link, który pomoże Ci przejść dalej: http://www.developerscrappad.com/408/java/java-ee/ejb3-jpa-3-ways-of-generating-primary-key-through-generatedvalue/ –