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