spring数据和mongodb中级联存储的实现

spring数据和mongodb中级联存储的实现,mongodb,spring-data,spring-data-mongodb,Mongodb,Spring Data,Spring Data Mongodb,我正在实现一个基于spring数据和mongodb的应用程序 QATemplate.java 我有一个字段,可以是简单的文本,也可以是嵌入的文档。 因此,我将该字段创建为对象类型 @Field("answer") private Object answer; 它工作得很好。 但我需要用自己的id保存嵌入的文档,并将其id作为引用传递到此文档中,所以我必须这样编写代码 @Field("answer") @DBRef @CascadeSave pri

我正在实现一个基于spring数据和mongodb的应用程序

QATemplate.java 我有一个字段,可以是简单的文本,也可以是嵌入的文档。 因此,我将该字段创建为对象类型

    @Field("answer")
    private Object answer;
它工作得很好。 但我需要用自己的id保存嵌入的文档,并将其id作为引用传递到此文档中,所以我必须这样编写代码

    @Field("answer")
    @DBRef
    @CascadeSave
    private Object answer;
{
    "title":"Indiaa",
    "answerType":"text",
    "answer":[
            {
                 "title":"Indiaana jones",
                 "answerType":"text",
                 "answer":"testing vvv"
            }
        ]
}
为了实现级联保存,我使用了

CasecadeSave.java CasecadeCallback.java CascadeSaveMongoEventListener.java 但是在应用这段代码之后,如果我像这样插入json数据

    @Field("answer")
    @DBRef
    @CascadeSave
    private Object answer;
{
    "title":"Indiaa",
    "answerType":"text",
    "answer":[
            {
                 "title":"Indiaana jones",
                 "answerType":"text",
                 "answer":"testing vvv"
            }
        ]
}
我有一个错误:

threw exception [Request processing failed; 
nested exception is java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.mongodb.BasicDBList] with root cause
java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.mongodb.BasicDBList
HTTP Status 500 - Request processing failed; 
nested exception is org.springframework.data.mapping.model.MappingException: No mapping metadata found for class java.lang.String
如果我尝试像这样插入json数据:

{
    "title":"Indiava",
    "answerType":"text",
    "answer":"vv"
}
{
    "title":"Where is India",
    "answerType":"text",
    "answer":{
        "text":"Asia"
    }
}
我有一个错误:

threw exception [Request processing failed; 
nested exception is java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.mongodb.BasicDBList] with root cause
java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.mongodb.BasicDBList
HTTP Status 500 - Request processing failed; 
nested exception is org.springframework.data.mapping.model.MappingException: No mapping metadata found for class java.lang.String

使用
DBRef
时,您只保存对它的引用,而不是将您的
答案
对象保存在
QATemplate
中,但它位于另一个集合中:

{ "$ref" : "COLLECTION", "$id" : ObjectId("someobjectID") }
此外,您说您想要一个答案“文档”,但实际上您首先传递了一个数组,然后传递了一个简单的字符串

要使其运行,请创建一个包含应答文档和字符串应答的类型。这样,
Spring数据MongoDB
就会知道将它放在哪个集合中。首先,尝试使用一个文档,如下所示:

{
    "title":"Indiava",
    "answerType":"text",
    "answer":"vv"
}
{
    "title":"Where is India",
    "answerType":"text",
    "answer":{
        "text":"Asia"
    }
}
其中,
答案
为:

@Field("answer")
@DBRef
@CascadeSave
private Answer answer;
@Document(collection = "Answers")
public class Answer {
    @Id
    private String id;

    String text;
}
答案是:

@Field("answer")
@DBRef
@CascadeSave
private Answer answer;
@Document(collection = "Answers")
public class Answer {
    @Id
    private String id;

    String text;
}

一旦运行,将
Answer
转换为一个界面,然后使用
TextAnswer
(简单文本)或
FullAnswer
(整个答案文档)。根据我的要求,
Spring-Data-MongoDB

支持多态性。答案不是预定义的,可以是字符串或qamplate。如果是字符串,则只应创建一个文档,但如果是QATemplate,则应保存所有子文档并在主文档中传递其引用。在每次建议的答案中,当答案为TextAnswer时,它将仅为答案创建一个文档,并在主文档中进行引用。i、 e.保存两个不同的文档。但我只想保存一个文档,以防出现字符串。