Java @Embedded objects中的Morphia@PrePersist

Java @Embedded objects中的Morphia@PrePersist,java,mongodb,morphia,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 Dat

我有以下项目和视频课程:

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();
    }
}
每当我保存item对象时,都会在item和Video类中修改日期。这是调用时的预期结果:
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中更新我的日期。但这实际上是错误的:项目已被修改,但视频未被修改。

更新答案:

那样不行<调用
save
时,code>prePersist()将始终在完整文档上运行。您需要发出更新查询或显式设置它

AFAIK MongoDB不会检查更改,因此如果没有一些手动干预,这将无法工作


旧答案:

在我看来,将数据存储混合到实体中看起来很奇怪——我会尽量避免这种情况。您是对的,性能会受到影响,并且您可能(通常)遇到并发问题,因为没有事务

下面的方法不管用吗

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

PS:既然文档中已经有日期,为什么还需要将其保存到嵌入的子文档中?这两个应该总是匹配的,不是吗?

不。也许我不清楚我的问题:我希望video.modified只有在video对象真正被修改时才有一个新的日期。若要保存项对象,并不意味着嵌入项中的视频对象已被修改。也许项目对象有更多的字段,我会修改它们,但我不会修改视频对象内部的任何内容。谢谢。我就是这么想的。我想就性能而言,最好的办法是在每次我意识到我真的修改了那个对象时,更新每个对象中的修改字段。无论如何,谢谢你的意见