我有以下项目和视频类:
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中更新我的日期。但这实际上是错误的:该项目已被修改,但不是视频。
答案 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:由于您已经在文档中有日期,为什么还需要将其保存到嵌入式子文档中?两者应该总是匹配,不应该匹配吗?