【问题标题】:java.lang.IllegalStateException, "Primary key for object of type Parent is null" except I can print it and its NOT nulljava.lang.IllegalStateException,“Parent 类型对象的主键为 null”,但我可以打印它并且它不是 null
【发布时间】:2011-04-18 01:39:52
【问题描述】:

我想不出还有什么方法可以解决我的问题。这是我昨天做的一个线程,详细描述了父子类:https://stackoverflow.com/questions/3800450/many-to-one-unidirectional-gae-jdo-relationship-amongst-entities

我正在尝试添加 Truck 并将其持久化,但持久性管理器坚持认为父项的主键为 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.

【问题讨论】:

  • 显然任何异常都有一个堆栈跟踪来说明谁抛出它......可能是 GAE/J 插件

标签: google-app-engine persistence jdo datanucleus


【解决方案1】:

也许父级不是持久状态,而是分离的?还是瞬态的?为什么不打印出对象的状态

【讨论】:

    【解决方案2】:

    也许父母和孩子由不同的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
    

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2013-09-28
      • 2012-05-01
      • 2023-03-20
      • 1970-01-01
      • 2021-06-24
      相关资源
      最近更新 更多