mongo morphia实体集合映射

来源:互联网 发布:php银联支付流程 编辑:程序博客网 时间:2024/05/19 17:27

ref:http://www.myexception.cn/database/610959.html

Morphia,一个轻量级的类型安全的 Java 类库,用来将在 MongoDB 和 Java 对象之间进行映射. 类似hibernate。如果使用过hinernate再使用它会上手很快

POJO

@Entity(value = "test", noClassnameStored=true)
//默认是要持久所有对象的
public class Meeting {
    @Id
    private ObjectId id;

    // 标题
    // @Transient //这个表示不持久
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

      public ObjectId getId() {
        return id;
    }

    public void setId(ObjectId id) {
        this.id = id;
    }
}      

@Entity实体类,name为collection的名称,noClassnameStored用来标识是否需要存储className字段来表示类名,为什么要使用他哪?保存类名的主要目的是,当你在同一个链接中保存不同的实体对象,但是你想

 作为他们的基类或超类来读取。

 如:

   @Entity("animals") abstract class Animal { String name; } 

@Entity("animals") Cat extends Animal { ... } 

@Entity("animals") Dog extends Animal { ... } 

//And then performing the following query...

List<Animal> animals = ds.createQuery(Animal.class).asList(); 

 正如你看到的,如果不在文档中保存类名,Morphia将不能正确的识别创建那个类。

 如果你在一个链接中只保存唯一的实体类型并且你还关心你的数据库大小,在你的@Entity注解上加上noClassnameStored=true

 参数将会是安全的。

 

@Id

被@Entity注解的类必须有一个唯一的 @Id值;这些值被保存在 MongoDB数据库的“id”属性中,这是一个必须的为索引。被@Id注解的ID是ObjectId类型的,这样,你就不用担心Id的生成问题了,Mongo会自动为你生成一

  个唯一的新的ObjectId对象(就行MySQL中的auto_increment类型的ID)。如果你想使用其他的类型作为ID,那么在你保存数据时就必须

  手动为ID赋值。

 

 @Indexed

此注解是为某个字段申请一个索引。 当datastore.ensureIndexes() 方法被调用时 这些索引就会被申请

 参数说明如下:

   value: 表名这个索引的方向; IndexDirection.ASC(升序),IndexDirection.DESC(降序), IndexDirection.BOTH(两者)

             默认为 升序;

   name: 被创建的索引的 名称; mongodb默认创建的索引名的格式为(key1_1/-1_key2_1)

   unique: 创建一个唯一索引,当创建唯一索引后,当在此字段插入相同的值时将会报错。true:为唯一索引;false:不是唯一索引。

                 默认为:false

   dropDups:此参数表明,当为某个字段创建唯一索引时,删除其他相同值的记录。只保留第一条记录。true:删除重复,

                      false:不删除重复(当有重复值时唯一索引创建失败);默认为false.

注意:当在一个存在的系统上,创建已经存在的索引时,将不会花费任何事件(也不会做任何事情)。

        Morphia m = .....

        Datastore ds = ....

      m.map(Product.class);

      ds.ensureIndexes();  //为被@Indexed注解的所有字段创建索引。

 

@Embedded

你可以创建一个类被嵌套在实体类中,在这种情况下我们可以使用@Embedded注解。例如,在Hotel类中 可能会有一个Address。

     Address是Hotel不可分割的一部分,没有ID, 并且不会被存储在分开的collection中。在这种情况下我们可以使用@Embedded注解

   Address.

      @Entity

      public class Hotel{

        ...

        @Id

       private ObjectId id;

       @Embedded(“address”)

       private Address address;

       ...

      } 

      @Embedded

    public  class Address{

        ...

     }

正如你所看到的,被@Embedded注解的类没有@Id。 这是因为他们经常被嵌套在其他类中。事实上,被@Embedded注解的类也不允许有@Id 

@Reference

和@Embedded类似,但是被存储在分开的collection中

@Entity
public class BlogEntry {

    @Id
    private ObjectId id;

    private String title;
    private Date publishDate;
    private String body;

    @Reference(“blog _author”)
    private Author author;

    // getters and setters
}

...

@Entity(“author”)
public class Author {

    @Id
    private ObjectId id;

    private String username;
    private String fullName;
    private String emailAddress;

    // getters and setters
}

 

@Property

指定对应数据的名称如@Property("started")

 

@AlsoLoad

Load的时候可以从一个或多个域里取值,但要保证这多个域在同一个document里只出现一次 如 字段定义了  title字段并注解了 @AlsoLoad({"xxx",”xxx1”}),则可以从数据库的title、xxx、xxx1里取值,但同一个document里只能存在title、xxx、xxx1里的一个

 

@NotSaved

只会被load不会被save

 

@PrePersist – 在保存之前调用

@PostPersist – 保存之后调用

@PreLoad – 在映射成POJO前调用

@PostLoad – 在映射成POJO后调用