2017-08-07 12 views
6

mam model jak poWiosna MongoDB szablon zapisuje w tym samym obiekcie

@CompoundIndexes(value = { 
     @CompoundIndex(name = "catalog_idx", def = "{'code' : 1, 'brand' : 1}", unique = true) }) 
@Document(collection = Catalog.ENTITY) 
public class Catalog extends AbstractModel<String> { 

    private static final long serialVersionUID = 1L; 

    public static final String ENTITY = "catalog"; 

    @NotNull(message = "Code is required") 
    @Field("code") 
    private String code; 

    @NotNull(message = "Brand is required") 
    @DBRef(lazy = true) 
    @Field("brand") 
    private Brand brand; 
} 

Kiedy zrobić uratować z mongoTemplate.save(object); widzę tylko 2 obiekty utworzone w DB zamiast 6. Tuż przed uratować moje wiersze debugowania dla obiektów być uratowanym.

Catalog [code=StagedCatalog, brand=Brand [code=Brand_3]] 
Catalog [code=StagedCatalog, brand=Brand [code=Brand_2]] 
Catalog [code=StagedCatalog, brand=Brand [code=Brand_1]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_2]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_1]] 
Catalog [code=OnlineCatalog, brand=Brand [code=Brand_3]] 

Jakieś pomysły, dlaczego? Czuję, że unikatowa funkcja Indeksu nie działa w jakiś sposób. Chcę code i brand być unique combination.

public abstract class AbstractModel<ID extends Serializable> implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private ID id; 
} 
+0

masz kod, który tworzy katalog? Czy masz kolumnę "@id" w abstrakcyjnym modelu? możesz to również zarejestrować? – wargre

+0

@wargre did .... –

Odpowiedz

5

Ustawiono unikatowy indeks. Oznacza to, że nie będziesz mieć 2 dokumentów z tym samym kodem i marką.

Teraz ustawiono kolumnę ID na obiekt ID. Fakt, że masz 2 Włóż zamiast 6 oznacza, że ​​używasz tego samego identyfikatora 3 wkładki, coś jak:

for (code: {"StagedCatalog","OnlineCatalog"}) { 
    ID id=new ID(...); 
    for (brand: {1, 2, 3}){ 
     Catalog cat=new Catalog(); 
     cat.setId(id);    // <<== this is wrong, you reuse the same id, you will insert first brand, then update to brand2 and brand3. 
     cat.setCode(code); 
     cat.setBrand(brand); 
     mongoTemplate.persist(cat); 
    } 
} 

Aby temu zapobiec, trzeba:

Catalog cat=new Catalog(); 
ID id=new ID(realUniqueId); // RealuniqueId can be code+brand for instance 
cat.setId(id); 
... 
+0

ID jest ustawiane przez wiosenną mongodb bezpośrednio. –

+0

Jesteś pewien, że nie korzystasz ponownie z tego samego obiektu? – wargre

+0

Tak, jestem pewien. Widzisz dzienniki tuż przed zapisaniem. Teraz żadna kombinacja kodu i marki nie koliduje. Co zrozumiałem z kluczy złożonych, jak na wiosnę dokumentacja Mam nadzieję, że moja konfiguracja jest poprawna Dodatkowo, gdy zapisuję wszystkie te obiekty są świeże, to znaczy, że ID jest pusta przed zapisaniem, a po zapisaniu będą miały wartość. Więc nie rozumiem, dlaczego wiosna mongodb ratuje istniejący byt. Tak więc wiosenny monondb złożony klucz unikalny zakładam, że połączenie jest unikatowe, a nie indywidualny kod i marka są niepowtarzalne. –

Powiązane problemy