数据存储应用程序引擎和objectify中的java持久化关系
我的应用程序正在使用objectify。我对NoSql真的很陌生
我有一个这样的数据模型。不要注意缺少getter和setter,缺少builder模式等等,这只是一个例子
如您所见,ReallyWeirdCar是一个相当深的对象图的根
现在,假设我使用给定的方法完全在内存中构建一个真正古怪的car对象
另外,假设数据存储完全为空
如何使用objectify保存该对象强>
是y()吗。save()。实体(rwc1)是否足以一次保存整个对象图
我如何维持这样的关系
此外,如果大多数时候我正在执行诸如“找到客户所请求的所有汽车”之类的疑问,你会认为这是一个“好”(性能)模型吗?
提前支付thx
@Entity
class ReallyWeirdCar {
@Id
public String id;
public String name;
@Load
public Ref<Engine> e1;
@Load
public Ref<Engine> e2;
// a reference to the customer who solicited the construction of this car
@Index
@Load
public Ref<Customer> customer;
}
@Entity
class Customer {
@Id
public String id;
public String name;
}
@Entity
class Engine {
@Id
public String id;
public String name;
@Load
public Ref<List<Carburetor>> ecs;
}
@Entity
class Carburetor {
@Id
public String id;
public String name;
@Load
public Ref<Manufacturer> manufacturer;
}
@Entity
class Manufacturer {
@Id
public String id;
public String name;
}
// inside some service
public buildAndPersistCar() {
Customer cust1 = new Customer("cust1", "customer1");
Manufacturer m1 = new Manufacturer("m1", "manufacturer1");
Carburetor c1 = new Carburetor("carb1", "carburetor1", m1);
Carburetor c2 = new Carburetor("carb2", "carburetor2", m1);
Carburetor c3 = new Carburetor("carb3", "carburetor3", m1);
Carburetor c4 = new Carburetor("carb4", "carburetor4", m1);
Engine e1 = new Engine("e1", "engine1", Arrays.asList(c1,c2));
Engine e2 = new Engine("e2", "engine2", Arrays.asList(c3,c4)));
ReallyWeirdCar rwc1 = new ReallyWeirdCar("rwc1", "reallyweirdcar1", e1, e2, cust1);
// what do i do here ????
// how do i persist rwc1 ???
}
# 1 楼答案
Objectify中没有“级联保存”的概念。如果要保存N个实体,则必须显式保存所有实体你保存的就是你保存的
从性能的角度来看,这看起来不太理想。GAE数据存储喜欢更粗粒度的实体;您的示例需要四轮抓取才能到达制造商。如果这是一个真正精确的模型,那么你可能希望接受它;四轮抓取不会让你丧命,尤其是大多数实体都在memcache中。但若你们能对模型进行非规范化(比如,在发动机中嵌入化油器),你们可能会使它更快
这与您在关系数据库(规范化或非规范化)中面临的问题完全相同。使用Objectify实际上更容易,因为Objectify在批量获取的“轮数”方面很聪明;您将得到四个API调用,而不是~N^4个API调用。但是,装载一台装满数千个部件的发动机仍然是一件痛苦的事情