@Embedded对象中的Morphia @PrePersist

时间:2014-05-21 09:31:00

标签: java mongodb morphia

我有以下项目和视频类:

import org.mongodb.morphia.annotations.Entity;    
@Entity(value = "item")
public class Item{
    @Id
    ObjectId id;
    Date modified;
    String title;
    Video video;
    @PrePersist 
    void preItem() {
        modified = new Date();
    }
}
import org.mongodb.morphia.annotations.Embedded;    
@Embedded
public class Video{
    Date modified;
    @PrePersist 
    void preVideo() {
        modified = new Date();
    }
}

无论何时保存项目对象,都会在项目和视频类中修改日期。这是调用datastore.save(this)时的预期结果。

当对象真正改变时,有一种非手动方式来更新日期,而不是每当执行保存时都会更新日期?

将新对象(在内存中)与旧对象(在数据库中)进行比较可能是一个解决方案:

//Inside the Item class
@PrePersist
void preItem(){
    Item oldItem=find.query().field("_id").equal(this.id)
        .field("video").equal(this.video).get()
    if(oldItem != null) oldItem.video.modified;         
}

但这意味着在每次调用datastore.save(this)时我都会查询数据库。从性能的角度来看,是不是不推荐?还有其他更好的方法吗?

修改 目标是拥有一个真正的修改日期值。我们假设我修改了项目的标题:item.title="Whatever"。然后我执行item.save()。这将在item.modified和item.video.modified中更新我的日期。但这实际上是错误的:该项目已被修改,但不是视频。

1 个答案:

答案 0 :(得分:0)

更新回答:

它不会那样工作。致电prePersist()时,save将始终在完整文档上运行。您需要发出更新查询或明确设置。

AFAIK MongoDB不会检查更改,因此如果没有人工干预,这将无法正常工作


旧答案:

将数据存储区混合到实体中对我来说很奇怪 - 我会尽量避免这种情况。你是对的,性能会受到影响,你可能(通常)遇到并发问题,因为没有交易。

不会做以下工作吗?

@PrePersist 
void preItem() {
    modified = new Date();
    video.setModified(new Date()); // or probably fetch new Date() once and use it for both
}

PS:由于您已经在文档中有日期,为什么还需要将其保存到嵌入式子文档中?两者应该总是匹配,不应该匹配吗?