Domanda

Fondamentalmente, voglio un modo per accedere ai valori della sequenza in modo neutrale rispetto al database. Il caso d'uso è che ho un campo su un'entità che voglio impostare in base a un valore crescente (diverso dall'ID).

Ad esempio, supponiamo che io abbia un'entità Spedizione . Ad un certo punto dopo che la spedizione viene creata, viene spedita. Una volta che viene spedito, viene generato un numero manifest e assegnato. Il numero manifest assomiglia a M000009 (dove la roba dopo la 'M' è un valore imbottito a sinistra da una sequenza).

È stato chiesto qualcosa di simile qui a SO , ma non sono un fan della soluzione poiché richiede un altro tavolo da mantenere e sembra una strana relazione da avere.

Qualcuno sa se è possibile usare qualcosa come MultipleHiLoPerTableGenerator di hibernate come qualcosa di diverso da un generatore di ID?

Se ciò non è possibile, qualcuno è a conoscenza delle librerie che lo gestiscono (utilizzando l'ibernazione o anche solo il JDBC puro). Preferirei non dover scrivere questo da solo (e avere a che fare con il prefetching dei valori, il blocco e la sincronizzazione).

Grazie.

È stato utile?

Soluzione

Penso che la complessità del tuo compito dipenda dal fatto che il tuo numero manifest debba o meno essere sequenziale:

  • Se non hai bisogno di numeri manifest sequenziali, allora sono giorni felici e puoi usare una sequenza.
  • Se hai bisogno di numeri manifest sequenziali (o se il tuo database non supporta le sequenze), usa una tabella id con il blocco appropriato in modo che ogni transazione ottenga un valore sequenziale univoco.

Quindi hai 2 opzioni a cui riesco a pensare:

  • scrivi il codice JDBC necessario sul tuo client, assicurandoti (se il numero manifest è sequenziale) che la transazione in uso sia la stessa di quella per l'aggiornamento del database.
  • usa un trigger per creare il numero manifest quando si verifica l'aggiornamento appropriato.

Penso che la mia preferenza sarebbe l'innesco perché il lato della transazione delle cose sarebbe curato, sebbene significherebbe che l'oggetto avrebbe bisogno di essere aggiornato sul client.

Altri suggerimenti

Non ho letto la soluzione simile collegata, ma suona come qualcosa che ho finito per fare. Ho creato una tabella solo per le sequenze. Ho aggiunto una riga alla tabella per ogni tipo di sequenza di cui avevo bisogno.

Ho quindi avuto una classe del generatore di sequenza che avrebbe fatto la query sql necessaria per recuperare e aggiornare il valore della sequenza per una sequenza denominata particolare.

Ho usato la classe dialettale di hibernate per farlo in modo neutro db.

Vorrei anche 'cache' le sequenze. Vorrei aumentare il valore della sequenza memorizzata di un numero elevato, quindi eliminare quelle sequenze allocate dalla mia classe di generatore. Se la classe fosse distrutta (ad es. Arresto dell'app), una nuova istanza del generatore di sequenza verrebbe avviata al valore memorizzato. (avere un vuoto nei miei numeri di sequenza non ha importanza)

Ecco un esempio di codice. Vorrei metterlo in guardia con: non l'ho scritto e richiede il codice di primavera. Detto questo, dovrebbe comunque fornire le ossa di ciò che vuoi fare.

public Long getManifestNumber() {
        final Object result = getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session sess) throws HibernateException, SQLException { 
                SQLQuery sqlQuery = sess.createSQLQuery("select MY_SEQUENCE.NEXTVAL from dual");
                sqlQuery.uniqueResult();
            }
        });
        Long toReturn;
        if (result instanceof BigDecimal) {
            toReturn = ((BigDecimal)result).longValue();
        }
        return toReturn;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top