春季是不是有 mongoDB 的 @MappedSuperclass 等效注释?

Posted

技术标签:

【中文标题】春季是不是有 mongoDB 的 @MappedSuperclass 等效注释?【英文标题】:is there a @MappedSuperclass equivalent annotation for mongoDB in spring?春季是否有 mongoDB 的 @MappedSuperclass 等效注释? 【发布时间】:2021-02-06 06:31:50 【问题描述】:

在我的项目中,我们在一定程度上正在从 SQL 转向 NoSQL。 我想知道,我们如何将 BaseClass 属性继承到 spring data mongo 中的子类中。 我知道如何在 Spring JPA for SQL 中做到这一点。

例如, 下面是用 @MappedSuperClass 注释的 BaseEntity 父类 它的字段为 id 和 version。

@MappedSuperclass
public class BaseEntity 
 
    @Id
    @GeneratedValue
    private Long id;
 
    @Version
    private Integer version;
 
    //Getters and setters omitted for brevity

实体可以扩展 BaseEntity 类并跳过声明 @Id 或 @Version 属性,因为它们是从基类继承的。

@Entity(name = "Post")
@Table(name = "post")
public class Post extends BaseEntity 
 
    private String title;
 
    @OneToMany
    private List comments = new ArrayList();
 
    @OneToOne
    private PostDetails details;
 
    @ManyToMany
    @JoinTable(//Some join table)
    private Set tags = new HashSet();
 
    //Getters and setters omitted for brevity
 
    public void addComment(PostComment comment) 
        comments.add(comment);
        comment.setPost(this);
    
 
    public void addDetails(PostDetails details) 
        this.details = details;
        details.setPost(this);
    
 
    public void removeDetails() 
        this.details.setPost(null);
        this.details = null;
    

@Entity(name = "PostComment")
@Table(name = "post_comment")
public class PostComment extends BaseEntity 
 
    @ManyToOne(fetch = FetchType.LAZY)
    private Post post;
 
    private String review;
 
    //Getters and setters omitted for brevity

如何在 Mongo 中实现相同的功能?例如

@MappedSuperclass
public class BaseEntity 
 
    @Id
    @GeneratedValue
    private Long id;
 
    @Version
    private Integer version;
 
    //Getters and setters omitted for brevity

@Document(collection = "Post")
public class Post extends BaseEntity 
 
    private String title;
 
    //Rest of the code

@Document(collection = "PostComment")
public class PostComment extends BaseEntity 
 
    @ManyToOne(fetch = FetchType.LAZY)
    private Post post;
 
    private String review;
 
    //Getters and setters omitted for brevity

【问题讨论】:

【参考方案1】:

在 Mongo 中您不需要任何注释来执行此操作。 Mongo 自己会为你处理超类。

只需在所有实体中扩展 BaseEntity 类,当您将实体读取和写入数据库时​​,所有实体都将具有 BaseEntity 类的字段。这也适用于多级层次结构。即Post extends BaseEntityBaseEntity extends Entity,在这种情况下 Post 将包含来自 BaseEntity 和 Entity 类的字段。

【讨论】:

我们如何获得子类属性? 从repository返回数据时,总是返回子类,所以可以直接获取子类属性 我正面临这个问题,但我没有得到子类属性

以上是关于春季是不是有 mongoDB 的 @MappedSuperclass 等效注释?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在春季数据mongodb中使用$ where?

春季启动MongoDB配置

在春季更改mongodb标准内容

是否有办法在春季为自定义依赖项找出application.properties文件的属性名?

使用 REST 访问 MongoDB 数据

春季安全认证