Ho un ente che ha un campo NON-ID che deve essere impostato da una sequenza. Attualmente, recupero il primo valore della sequenza, lo memorizzo sul lato client e calcola da quel valore.ottenere valore successivo sequenza dal database utilizzando hibernate
Comunque, sto cercando un modo "migliore" di fare questo. Ho implementato un modo per andare a prendere il successivo valore di sequenza:
public Long getNextKey()
{
Query query = session.createSQLQuery("select nextval('mySequence')");
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
Tuttavia, in questo modo riduce le prestazioni in modo significativo (creazione di ~ 5000 oggetti viene rallentato di un fattore 3 - da 5740ms a 13648ms).
Ho provato ad aggiungere un'entità "falso":
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
Tuttavia questo approccio non ha funzionato neanche (tutti gli ID restituito erano 0).
Qualcuno mi può consigliare come recuperare il valore della sequenza successiva utilizzando in modo efficiente Hibernate?
Edit: Dopo alcune indagini, ho scoperto che chiamare Query query = session.createSQLQuery("select nextval('mySequence')");
è di gran lunga più inefficienti rispetto all'uso del @GeneratedValue
- a causa di Hibernate qualche modo riesce a ridurre il numero di recuperi quando si accede la sequenza descritta da @GeneratedValue
.
Per esempio, quando creo 70.000 entità, (quindi con 70.000 chiavi primarie recuperati dalla stessa sequenza), ottengo tutto quello che serve.
TUTTAVIA, Hibernate emette solo select nextval ('local_key_sequence')
comandi. NOTA: dal lato del database, la memorizzazione nella cache è impostata su 1.
Se provo a recuperare tutti i dati manualmente, ci vorranno 70.000 selezioni, quindi un'enorme differenza di prestazioni. Qualcuno conosce il funzionamento interno di Hibernate e come riprodurlo manualmente?
Solo una nota: poiché la classe indica che questo funziona solo su PostgreSQL, poiché la sintassi SQL è di riferimento da Oracle. –