跳转至

实体

Mars 实体关联

实体的定义

实体类一般指 pojo类 或具备以下特征的开放类
基于对象安全
包含基础的属性
* 公开的 getter / setter 方法

与 MongoDB数据库映射 过程 相关联后 实体应当 具备以下特性
类开放 能够被Mars 内部探测器加载到
构造开放
字段开放
当字段不开放时应当提供 开放的 getter/setter
主键 id 的存在
字段类型可识别

实体相关的注解

Mars使用Java注释的特性来描述Java对象如何被持久化到MongoDB数据库中去。以下是Mars比较常用的注释。

@Entity

@Entity注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存,同时与Mars 对象注入,自动加载相关。 该注解与表名相关联,在默认情况下,Mars 使用类名称来命名集合。

注解

@Id

  • 描述:文档主键注解 @Id注释指示Mars 哪个字段用作文档ID,@Id注释是必需的。如果试图持久保存对象(其@Id注释的字段为null),则Mars 会自动生成ID值。 注意 @Id 注解一般来描述 String 类型或 ObjectId 类型的字段。 其他类型的数据可能会与MongoDB 内置的_id 要求冲突。
属性 类型 必须指定 默认值 描述
concreteClass Class<?> Object.class 用于读取值映射类型

@Property

  • 描述:文档字段注解 类属性标记@Property注释, 表明为此属性在MongoDB数据库取一个别名。 同时声明字段类型 用于反序列化
属性 类型 必须指定 默认值 描述
value String "" 用于读取值映射类型
concreteClass Class<?> Object.class 用于读取值映射类型

@Representation(BsonType.OBJECT_ID)

  • 描述:文档类型注解 如使用该注解必须指定值 类属性标记@Representation。其声明了 在MongoDB 集合上该属性将被修改为指定类型。
属性 类型 必须指定 默认值 描述
value BsonType null 用于类型映射

@PropIgnore

类属性标记@PropIgnore注释则表明这个字段将不被持久化到数据库。

Mars编程模型

本节上通过定义一个简单的类以及一些操作代码片段来说明Mars功能的编程模型,使得我们可以从总体上了解Mars开发。

定义被持久类

@Entity
public class MyEntity {
@Id
public ObjectId id;

public String name;

}

初始化 Mars

Mars mars = new Mars(MongoClientSetting setting);

持久化

mars.insert(new MyEntity());

查询

mars.findAll(new Query(),MyEntity.class);

示例 及基础相关的说明

在实际环境中不建议您使用如此多的注解 如果您的实体属性类型及字段名称 与 数据库内的文档保持一致的状态 那么 在Mars 框架内部 他会自动的完成相应的映射 而且性能更高; 如果您需要修改 数据存储的类型 或 存储字段的名称 那么您可能会使用到 @Representation 及 @Property 等注解

tips: 这个示例说明 @Entity 注解表明这是个实体 ,他映射的表名为 student
@Id() 注解表明 以stuNo字段为主键 同时会自动映射到 mongoDB 数据库文档的 _id 字段
@Representation 注解表明 让 stuNo 这个字段映射为 OBJECT_ID 类型 而不是原始的 String 类型
@Property(value = "sex") 注解表明 需要修改这个字段的名称,以sex名称存储,而不是stuSex 名称

编写实体类 Student.java(此处使用了 Lombok 简化代码)

@Entity("student")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

        @Id()
        @Representation(BsonType.OBJECT_ID)
        private String stuNo;

        private String classNo;

        private String stuName;

        private Integer stuAge;

        private Double stuHeight;

        @Property(value = "sex")
        private Gender stuSex;

        @Property(value = "cscore")
        private Double chineseScore;

        @Property(value = "mscore")
        private Double mathScore;

        @Property(value = "escore")
        private Double englishScore;

}

public enum Gender {

    F("男"),
    M("女");

    String sex ;

    Sex(String s) {
        sex = s;
    }

}