【发布时间】:2015-01-16 03:42:49
【问题描述】:
我正在开发一个部署到 Google App-Engine 的 Spring DispatcherServlet,它使用 JDO PersistenceManagerFactory 进行存储。
我正在使用 Eclipse Maven 插件和 Maven appengine 插件的组合在 Eclipse 中进行开发。 (我没有安装适用于 Eclipse 的 Google App Engine 插件,因为我没有成功让该设置正常工作。)
我已将此项目用作我自己的基础:
https://github.com/juleswhite/mobilecloud-14/tree/master/examples/12-VideoSvcAppEngineJDO
版权所有 2014,朱尔斯·怀特
我承认,尽管我是一位经验丰富的 C++ 开发人员,但我对我在这里尝试使用的任何技术/工具几乎没有经验。我已经筋疲力尽地试图弄清楚这一点,我不能确定错误在哪里。我有一个部分工作的项目,很乐意发布您认为有帮助的任何其他代码。
主题一:
让我从我的设计的一个基本假设开始。我的理解是一个 PersistenceManagerFactory 应该能够处理许多不同的 JDO 类。在我的示例中,我有一个 Caregiver 对象和一个 Patient 对象,每个对象都使用 DataNucleus Annotation 进行了标记。
Caregiver.java
@PersistenceCapable
public class Caregiver {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String firstName;
@Persistent
private String lastName;
@Persistent
private String phone;
@Persistent
private String email;
@Persistent
public ArrayList<Long> patients;
public Caregiver() {
patients = new ArrayList<Long>();
}
...
Patient.java
@PersistenceCapable
public class Patient {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long sysId;
@Persistent
private Long caregiverId;
@Persistent
private String firstName;
@Persistent
private String lastName;
@Persistent
private String recordNum;
@Persistent
private String dob;
@Persistent
private ArrayList<Long> checkIns;
@Persistent
private ArrayList<Long> meds;
public Patient() {
checkIns = new ArrayList<Long>();
meds = new ArrayList<Long>();
}
...
我通过和改编 Dr. Whites Code 中提供的接口访问 PersistenceManagerFactory。我的适应应该是将 PMF 扩展到多种数据类型。
JDOCrudRepository.java
....
public Object save(Object entity) {
return PMF.get().getPersistenceManager().makePersistent(entity);
}
....
public Iterable<Object> findAll(Class<?> type) {
Query query = PMF.get().getPersistenceManager().newQuery(type);
Object rslt = query.execute();
return (Collection<Object>) rslt;
}
....
PMF.java
/*
* @author jules
*
*/
public final class PMF {
private final PersistenceManagerFactory pmfInstance = JDOHelper
.getPersistenceManagerFactory("transactions-optional");
public PMF() {
}
public PersistenceManagerFactory get() {
return pmfInstance;
}
}
我能够使用命令“mvn appengine:dev_server”构建和测试项目 使用我的 spring dispatcherServlet 我有有线函数可以从 PersistenceManagerFactory 添加和检索 Caregiver 对象。
CaregiverService.java
....
// GET ////////////////////////////////////////////////////////////////////
// TODO: Dangerous in production
@Override
@RequestMapping(value = CaregiverSvcApi.CAREGIVER_SVC_PATH, method = RequestMethod.GET)
public @ResponseBody
Collection<Caregiver> getCaregiverList() {
ArrayList<Object> objList = Lists.newArrayList(repo
.findAll(Caregiver.class));
ArrayList<Caregiver> cg = new ArrayList<Caregiver>();
for (Object object : objList) {
cg.add(object != null ? (Caregiver) object : null);
}
return cg;
}
...
// POST ///////////////////////////////////////////////////////////////////
@Override
@RequestMapping(value = CaregiverSvcApi.CAREGIVER_SVC_PATH, method = RequestMethod.POST)
public @ResponseBody
Caregiver postCaregiver(@RequestBody Caregiver cg) {
cg.setIdNull();
Caregiver newCg = (Caregiver) repo.save(cg);
return newCg;
}
...
从我的开发服务器获取的结果证明这些工作正常
GET http://127.0.0.1:8080/caregiver
[{"id":5676073085829120,"firstName":"Cg","lastName":"One","phone":"1234567","email":"1@x.com","patients":[]},
{"id":5682617542246400,"firstName":"z","lastName":"z","phone":"123","email":"z@z.com","patients":[]},
{"id":5715999101812736,"firstName":"c","lastName":"s","phone":"123","email":"c@s.com","patients":[]}]
问题的本质……
如果我将相同的方法应用于我的患者对象
CaregiverSvc.java
...
// GET ////////////////////////////////////////////////////////////////////
@Override
@RequestMapping(value = CaregiverSvcApi.PATIENT_SVC_PATH, method = RequestMethod.GET)
public @ResponseBody
Collection<Patient> getPatientList() {
ArrayList<Object> objList = Lists.newArrayList(repo
.findAll(Patient.class));
ArrayList<Patient> p = new ArrayList<Patient>();
for (Object object : objList) {
p.add(object != null ? (Patient) object : null);
}
return p;
}
...
// POST ///////////////////////////////////////////////////////////////////
@Override
@RequestMapping(value = CaregiverSvcApi.PATIENT_SVC_PATH, method = RequestMethod.POST)
public @ResponseBody
Patient postPatient(@Body Patient p) {
p.setIdNull();
Patient newP = (Patient) repo.save(p);
return newP;
}
...
现在,当我发布或获取患者对象时,我的结果始终为空。
GET http://127.0.0.1:8080/patient
[{"id":5113123132407808,"caregiverId":null,"firstName":null,"lastName":null,"recordNum":null,"dob":null,"checkIns":[],"meds":[]},
{"id":5697423099822080,"caregiverId":null,"firstName":null,"lastName":null,"recordNum":null,"dob":null,"checkIns":[],"meds":[]}]
我的所有患者对象都存储为空值,就好像我的 PersistenceManagerFactory 不知道如何解释患者对象一样。
主题 2:
如果我确实正确地使用了 PersistenceManagerFactory。为了让 PersistenceManagerFactory 正确处理患者对象,我还需要做些什么吗?
非常感谢您的宝贵时间。
【问题讨论】:
-
当您归还它们时,这些对象处于什么状态?空洞的 ?短暂的?日志会告诉你。数据库会告诉您实际保存的内容(日志也会告诉您)
-
我得到了一个看起来像病人对象的东西,它有一个有效的键和从我的保存函数返回的空成员。应用引擎管理面板报告相同。
标签: spring google-app-engine maven spring-mvc jdo