如何使用 java spring 注释在 MongoDB 中创建一个完全填充的引用对象

Posted

技术标签:

【中文标题】如何使用 java spring 注释在 MongoDB 中创建一个完全填充的引用对象【英文标题】:How do I make a fully populated reference object in MongoDB using java spring annotations 【发布时间】:2019-11-23 12:48:33 【问题描述】:

当我将相同的对象添加到我的 MongoDB 表中的数组中的表时,我遇到了主要的唯一约束错误。我真的想要数组中的整个对象,而不仅仅是对它的引用。

好的,所以我有一个书架,其中有很多书,每本书都有一个 id 作为唯一的主键。

书桌:


 "_id" : "1234-sc-myKey",
 "title" : "Tom Sawyer",
 "author" : "Mark Twain"

然后我有一个存储表:


 "_id" : "myStoreId-1",
 "name" : "book store 1",
 "books" : [ 
    
        "_id" : "1234-sc-myKey",
        "title" : "Tom Sawyer",
        "author" : "Mark Twain"
    ,
    
        "_id" : "5678-pc-myKey",
        "title" : "Huck Finn",
        "author" : "Mark Twain"
    
  ]
 

将同一本书添加到另一家商店时出现主键约束错误。我知道我可以做这个注释@DBRef 并使存储表看起来像这样:


 "_id" : "myStoreId-1",
 "name" : "book store 1",
 "books" : [ 
    
        "$ref" : "Book",
        "$id" : "1234-sc-myKey"
     
 

但是我必须再次查询每本书的数据库以获得标题列表。有没有办法让书在 store 表中,但在书上也有唯一的主键?我确信有一个很酷的 java spring 注释,但我没有找到它。

Java 信息​​:

课本

@JsonAutoDetect
@JsonIgnoreProperties(ignoreUnknown = true)
@Document(collection = "Book")
@CompoundIndexes(
    @CompoundIndex(name = "pk_idx", def = "'bookId':1, 'type': 1, 'myKey': 1", unique=true)
)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Book 

 @Id
 private String id;
 etc...

类商店:

 @JsonAutoDetect
 @JsonIgnoreProperties(ignoreUnknown = true)
 @Document(collection = "Store")
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class Store 
  @Id
  private String id;
  private String name;
  //this is the solution where it throws unique constraint
  private List<Book> books;

  //this is the solution I don't like
  @DBRef
  private List<Book> books;

【问题讨论】:

【参考方案1】:

尝试在private List&lt;Book&gt; books;Store 上方添加@Reference

【讨论】:

是的!谢谢你。这是我获得断开连接的完全填充参考所需的注释。非常感谢!

以上是关于如何使用 java spring 注释在 MongoDB 中创建一个完全填充的引用对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将基于 java 的注释 maven 项目转换为 Spring Boot?

Spring @transactional 是不是与 MongoDB 一起使用?

Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

为什么在依赖注入上使用java进行注释

XML到Spring Java注释转换

Java Spring Redis:设置使用注释的时间