春季启动mongodb @dbref级联不起作用

时间:2019-03-01 06:24:40

标签: json spring-boot spring-mongodb

我正在努力对被引用对象进行Spring Boot MongoDB级联操作。下面是MongoDB文档架构类。

==发布

@Getter
@Setter
@Document(collection="Post") // (1)
public class Post {

    @Id
    private String _id;

    @Indexed(unique = true) 
    private Long id; 

    private String title;

    private String body;

    private Date createdDate;

    @DBRef(db = "User", lazy = true) 
    private User user;

    @DBRef(db = "Tag", lazy = true) 
    private Collection<Tag> tags;

==用户

@Getter
@Setter
@Document(collection="User") // (1)
public class User {

    @Id //(2)
    private String _id;

    @Indexed(unique = true)
    private Long id;

    @Indexed(unique=true)  // (3) 
    private String username;

    private String password;

    private String email;

    private String fullname;

    private String role;
}

==标签

@Getter
@Setter
@Document(collection="Tag")
public class Tag {

    @Id
    private String _id;

    @Indexed(unique = true)
    private Long mid;

    private String body;

    private Date createdDate;

    @DBRef(db = "User", lazy = true) 
    private User user;
}

但是@DBRef注释根本不起作用。它将引发以下异常。

2019-03-01 14:54:10.411 ERROR 5756 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mapping.MappingException: Cannot create a reference to an object with a NULL id.] with root cause

org.springframework.data.mapping.MappingException: Cannot create a reference to an object with a NULL id.
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.createDBRef(MappingMongoConverter.java:975) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:597) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]

将json文件导入MongoDB模式时,将显示上述错误。我发现使用谷歌搜索的一些参考文献site表示使用CascadingMongoEventListener类和用户定义的@CascadeSave注释生成新的事件源。但是我认为还有一些带有级联注释的解决方案。知道了吧。

2 个答案:

答案 0 :(得分:2)

Mongo不支持documents之间的关系。由于这种级联操作在Spring Data Mongo中不支持。您可以通过两种方式进行操作。

1)制作自己的级联处理程序(最好的方法是使用spring event发布者),但也可以使用没有弹簧事件see here的自定义处理程序来完成。
2)显式调用引用的DB进行操作。

答案 1 :(得分:0)

看看RelMongo,它是一个基于Spring Data的框架,可以进行级联,获取..甚至查找使用DBRef无法实现的查询