【发布时间】:2016-04-03 13:26:55
【问题描述】:
好的,这是我的需要。我想构建一个使用 Google App Engine Datastore 作为后端数据库的网络应用程序。
该应用程序允许用户免费注册一个帐户。当每个注册用户都可以有一个储蓄账户时,他们可以在他们的储蓄账户中存款或取款。
使用此链接中的信息https://cloud.google.com/appengine/docs/java/datastore/entities
我想出了这些代码
public class RegistrationServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String email = request.getParameter("email");
String pass = request.getParameter("pass");
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity user = new Entity("User");
user.setProperty("name",name);
user.setProperty("email",email);
user.setProperty("pass",pass);
datastore.put(user);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
DatastoreService ds=DatastoreServiceFactory.getDatastoreService();
String email = request.getParameter("email");
String pass = request.getParameter("pass");
double credit=request.getParameter("credit");
double debit=request.getParameter("debit");
int userKeyInt=0;
Query q=new Query ("User");
PreparedQuery pq=ds.prepare(q);
for (Entity u1:pq.asIterable()){
String emailStr=u1.getProperty("Email").toString();
String userIDStr=u1.getProperty("UserID").toString();
String passStr=u1.getProperty("Pass").toString();
if(emailStr.equals(email) && passStr.equals(pass)) {
userKeyInt=Integer.parseInt(userIDStr);
}
}
Key userKey=KeyFactory.createKey("User", userKeyInt);
try{
Entity user = ds.get(key);
Entity savingAccount=new Entity ("SavingAccount");
savingAccount.setProperty("UserID", user.getKey());
savingAccount.setProperty("Debit",debit);
savingAccount.setProperty("Credit",credit);
}
catch (EntityNotFoundException e){
e.printStackTrace();
}
}
}
因此,Savingaccount 的字段“UserID”起到外键的作用。
Entity user = new Entity("User");
Entity savingAccount=new Entity ("SavingAccount");
savingAccount.setProperty("UserID", user.getKey());
但我不确定我所做的是否正确,因为无法检查外键约束,我们是否需要像此链接https://cloud.google.com/appengine/articles/modeling 中所述的建模实体关系?
如果我确实需要建模实体关系,那该怎么做?
注意:每个用户可以有多个储蓄账户。
【问题讨论】:
-
NB1:调用
getProperty时不要调用toString()- 使用强制转换。否则,您将永远不会知道您是否犯了错误并在属性中存储了错误的数据类型。 -
NB2:循环遍历所有用户是非常低效的。使用查询查找具有正确电子邮件地址的用户。
-
NB3:为什么将 UserID 作为属性存储在 User 实体中?使用数据存储区自动生成的 ID。此外,ID 存储为 Long 值 - 使用整数可能会导致问题。
-
@AndreiVolgin,您说“循环遍历所有用户的效率非常低。使用查询来查找具有正确电子邮件的用户。”,那我该怎么办?好的,我们知道 email 是唯一的,那么如何在提供 email 时获取 user 对象呢?
-
@AndreiVolgin,另外,我不将 UserID 作为属性存储在 User 实体中,但我确实将 UserID 存储为 SavingAccount 实体的属性,因此它类似于关系数据库
标签: java entity-framework google-app-engine data-modeling google-cloud-datastore