java.lang.IllegalStateException,“Parent类型的对象的主键为null”,除了我可以打印它并且它的NOT null

时间:2010-09-28 01:37:02

标签: google-app-engine persistence jdo datanucleus

我无法想象还有更多方法可以解决我的问题。这是我昨天制作的一个主题,详细描述了父类和子类: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.

2 个答案:

答案 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