Mam obiekt, który ma pole NON-ID, które należy ustawić z sekwencji. Obecnie pobieram pierwszą wartość sekwencji, przechowuję ją po stronie klienta i obliczam od tej wartości.pobranie następnej wartości sekwencji z bazy danych za pomocą hibernacji
Jednak szukam "lepszego" sposobu robienia tego. I wprowadziły sposób, aby pobrać następną wartość sekwencji:
public Long getNextKey()
{
Query query = session.createSQLQuery("select nextval('mySequence')");
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
Jednak ten sposób zmniejsza istotnie wydajność (tworzenie ~ 5000 obiektów zostaje spowolniony przez współczynnik 3 - od 5740ms do 13648ms).
Próbowałem dodać „fałszywy” podmiot:
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
Jednak takie podejście nie działało (wszystkie identyfikatory były zwrócone 0).
Czy ktoś może mi doradzić, w jaki sposób wydajnie pobrać kolejną wartość sekwencji za pomocą Hibernacji?
Edit: Po dochodzeniu, I odkryli, że nazywając Query query = session.createSQLQuery("select nextval('mySequence')");
jest zdecydowanie mniej efektywne niż przy użyciu @GeneratedValue
- z powodu Hibernate jakoś udaje się zmniejszyć liczbę pobiera podczas dostępu do sekwencji opisanej przez @GeneratedValue
.
Na przykład, gdy tworzę 70 000 obiektów (w ten sposób z 70 000 kluczy podstawowych pobranych z tej samej sekwencji), otrzymuję wszystko, czego potrzebuję.
JEDNAK, Hibernate tylko wystawia select nextval ('local_key_sequence')
poleceń. UWAGA: Po stronie bazy danych buforowanie jest ustawione na 1.
Jeśli spróbuję pobrać wszystkie dane ręcznie, zajmie mi to 70 000 elementów, a tym samym ogromną różnicę w wydajności. Czy ktokolwiek zna wewnętrzne funkcjonowanie Hibernate i jak go odtworzyć ręcznie?
Uwaga: ponieważ klasa wskazuje, że działa tylko na PostgreSQL, ponieważ składnia SQL jest odpowiednikiem Oracle. –