我无法想象还有更多方法可以解决我的问题。这是我昨天制作的一个主题,详细描述了父类和子类:https://stackoverflow.com/questions/3800450/many-to-one-unidirectional-gae-jdo-relationship-amongst-entities
我正在尝试添加一个Truck并保留它,但是持久性管理器坚持认为父项的主键是NULL,即使我在保持子项之前记录该值,并且父项是非null,实际上它也应该设置有效密钥。为什么持久性管理者会看到我不是的东西?
try{
if (!findTruck(truck)){
_logger.warning("get tweeter key " + truck.getTweeter().getEncodedKey());
pm.makePersistent(truck);
}
}
finally {
pm.close();
}
来自日志:
09-27 06:37PM 12.158
com.google.truxmap.server.TruckJdoDAO addTruck: get tweeter key agp0cnV4bWFwcGVych8LEgdUd2VldGVyIhJrZXltdW5jaGllbWFjaGluZTEM
W 09-27 06:37PM 12.160
com.google.truxmap.server.TruckJdoDAO addTruck: addTruck exception: class java.lang.IllegalStateException. Message:Primary key for object of type Tweeter is null.
答案 0 :(得分:1)
答案 1 :(得分:1)
父母和孩子可能由不同的ObjectManager管理。如果使用java,请确保父级和子级由同一个管理器(PersistenceManager)管理。下面的代码会抛出此异常。
PersistenceManager pm = JDOHelper.getPersistenceManagerFactory("transactions-optional");
Parent parent = (Parent)pm.getObjectById(Parent.class, parentKey);
pm.close();
// New object manager
pm = JDOHelper.getPersistenceManagerFactory("transactions-optional");
Child child = new Child();
child.setParent(parent);
pm.makePersistent(child); // Exception here