Как ссылаться на GridFSFile с аннотацией @DbRef (весенние данные mongodb) - PullRequest
3 голосов
/ 06 февраля 2012

у меня есть пружина @Document object Profile

Я хотел бы сослаться на GridFSFile, как это:

@DbRef
private GridFSFile file;

файл записывается в другой тип коллекции GridFS.

У меня всегда есть java.lang.StackOverflowError, когда я устанавливаю profile.setFile(file);

java.lang.StackOverflowError
at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:336)
at org.springframework.data.util.TypeDiscoverer.hashCode(TypeDiscoverer.java:365)
at org.springframework.data.util.ClassTypeInformation.hashCode(ClassTypeInformation.java:39)
at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:336)
at org.springframework.data.util.ParentTypeAwareTypeInformation.hashCode(ParentTypeAwareTypeInformation.java:79)
at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:336)

Не понимаю, если кому-то с идеей ссылаться на файл мне интересно

Спасибо, Xavier

1 Ответ

1 голос
/ 13 июня 2014

Я хотел что-то похожее и не нашел пути, поэтому я сделал этот обходной путь.

В вашем классе @Document поместите поле ObjectId

@Document
public class MyDocument {
     //...    
     private ObjectId file;
}

Затемв своем репозитории добавьте пользовательский метод для привязки файла к этому MyDocument, следуя советам от Оливера Гирке и используя GridFsTemplate:

public class MyDocumentRepositoryImpl implements MyDocumentRepositoryCustom {

    public static final String MONGO_ID = "_id";


    @Autowired
    GridFsTemplate gridFsTemplate;

    @Override
    public void linkFileToMyDoc(MyDocument myDocument, InputStream stream, String fileName) {
        GridFSFile fsFile = gridFsTemplate.store(stream, fileName);
        myDocument.setFile( (ObjectId) fsFile.getId());
    }

    @Override
    public void unLinkFileToMyDoc(MyDocument myDocument)
    {
        ObjectId objectId = myDocument.getFile();

        if (null != objectId)  {
            gridFsTemplate.delete( Query.query(Criteria.where(MONGO_ID).is(objectId)) );
            myDocument.setFile(null);
        }
    }
}

Кстати, вам нужнообъявите ваш GridFsTemplate в вашем JavaConf для автоматического подключения

@Bean
public GridFsTemplate gridFsTemplate() throws Exception {
    return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
}
...