2016-04-26 13 views
6

Ho una classe contratto definita in questo modo:Spring Data MongoDB: come ignorare il campo indicizzato univoco quando Document è incorporato in un altro?

@Document 
public class Contract { 

    @Id 
    private String id; 

    @Indexed(unique = true) 
    private String ref; 

    private String status = "pending"; 

    // getter & setter & hashcode & equals & tostring... 
} 

voglio salvare lo stato contratto nel corso del tempo, così ho creato una classe di versione come questa:

@Document 
public class Version { 

    @Id 
    private String id; 

    private Contract contract; 

    private Instant createdAt; 

    // getter & setter & hashcode & equals & tostring... 
} 

Quando si tenta di salvare più volte l'oggetto versione nel tempo, ho un'eccezione di chiavi duplicate. Penso che sia l'indice chiave duplicato sul riferimento del contratto che si lamenta qui.

Come posso ottenere questo tipo di cose?

+0

Potrebbe fornire un piccolo frammento di codice che mostra il tuo problema? Il modo in cui hai descritto il tuo modello, nessuna eccezione dovrebbe essere generata dal momento che l'oggetto Contatto è nidificato all'interno della Versione, il che significa che un contatto in una versione verrà memorizzato nella "versione (s)" come documento secondario e l'indice su la raccolta "contatti (i)" non dovrebbe avere importanza. –

+0

Non ho scritto più di quello. Basta creare due oggetti che uno è annidato in un altro con un indice univoco e cercare di salvare due oggetti con lo stesso contrat sottostante e si avrà un'eccezione di immissione duplicata. –

risposta

0

Non sono sicuro che ci sia un modo per ottenere questo dal contesto di primavera.

Il modo migliore è rimuovere tutta la definizione di indici al di fuori del codice. Applico tramite uno script offline. È possibile applicare script utilizzando strumenti come mongeez. Può essere configurato per essere eseguito all'avvio dell'applicazione, in modo da garantire che venga sempre eseguito indipendentemente dalla posizione.

Una volta che l'applicazione è attiva, potremmo voler creare nuovi indici in modo controllato. L'inserimento nel codice potrebbe non dare questo vantaggio poiché verrà eseguito solo all'avvio.

Se si stanno utilizzando script offline, si ha il controllo totale.

1

Basta aggiungere @Reference come questo:

@Document 
public class Version { 

    @Id 
    private String id; 

    @Reference 
    private Contract contract; 

    private Instant createdAt; 

    // getter & setter & hashcode & equals & tostring... 
} 
+0

questo in realtà funziona, ma non ci sono parole a riguardo nel riferimento mongodb dei dati di primavera ufficiale su di esso. –