【问题标题】:Datanucleus JDO setting fields to nullDatanucleus JDO 将字段设置为空
【发布时间】:2011-01-07 20:47:51
【问题描述】:

为了找到另一个问题,我的测试提出了以​​下代码。

public class TestPersistance {
 private static final PersistenceManagerFactory PMF = JDOHelper.getPersistenceManagerFactory("datanucleus.properties");
 public static final PersistenceManager pm = PMF.getPersistenceManager();
 static final TestUserDataDB ud = new TestUserDataDB();

 public static void main(String args[])
 {
  TestPersistance tp = new TestPersistance();
  tp.createData();
 }

  @Test  public void createData()
 {
  assertTrue("Null machined id at start", ud.machineId != null);
  pm.currentTransaction().begin();
   try
   {
  pm.makePersistent(ud);
   }
   finally
   {
  pm.currentTransaction().commit();
   }
   assertTrue("Null machined id at end", ud.machineId != null);
 }
}

第二个断言失败的地方。 IE。我要求持久化的对象正在被 makePersistent 调用更改。数据正在存储在数据库中。 有任何想法吗?任何人都可以证实这一点。 使用 jdo-api-3.0.jar datanucleus-core-2.2.0-release.jar datanucleus-enhancer-2.1.3.jar datanucleus-rdbms-2.2.0-release.jar mysql-connector-java-5.1.13.jar

在 Eclipse 中使用 MySql 数据库。

@PersistenceCapable
public class TestUserDataDB {

 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 public Long id;

 @Persistent
 public String userid = "test1";
 @Persistent
 public String machineId = "test2";

 // local userid
 @Persistent
 public long uid = 1L;

 @Persistent
 public long systemTime = 123L;
 public long chk = 1234L;
 public long createTime = System.currentTimeMillis();

 public TestUserDataDB()
 {
 }

 @Override
 public String toString() {
  return "TestUserDataDB [chk=" + chk + ", createTime=" + createTime
    + ", id=" + id + ", machineId=" + machineId + ", systemTime="
    + systemTime + ", uid=" + uid + ", userid=" + userid + "]";
 }



}

属性文件是

javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.jdo.JDOPersistenceManagerFactory
datanucleus.metadata.validate=false

javax.jdo.option.ConnectionDriverName=com.mysql.jdbc.Driver
javax.jdo.option.ConnectionURL=jdbc:mysql://localhost/test
javax.jdo.option.ConnectionUserName=root
javax.jdo.option.ConnectionPassword=yeahRight
datanucleus.autoCreateSchema=true
datanucleus.validateTables=false
datanucleus.validateConstraints=false

【问题讨论】:

    标签: mysql jdo datanucleus


    【解决方案1】:

    为什么要直接访问字段?访问类是否声明为 PersistenceAware ?好吧,并非如此,您不能这样做-使用吸气剂。 持久之前的“ud”对象状态是什么? (瞬态?)坚持后是什么? (空心?)日志说什么?很有可能它处于空心状态,然后您直接访问一个字段并且它没有任何价值(根据定义,根据规范)......但是由于您没有打扰调用 getter,因此没有机会检索价值。而且您可能还没有设置“RetainValues”持久属性

    建议您熟悉 JDO 规范和对象生命周期状态

    【讨论】:

    • 听起来我有一些阅读要做。以为我可以将类保存到数据库中,这就是它的结束,显然不是。
    • ps。谢谢,省了很多心痛。
    【解决方案2】:

    在某些情况下,有必要直接访问反序列化对象的属性(即,如果使用 GSON 库进行 JSON 序列化)。在这种情况下,您可以使用:

    MyClass copy = myPersistencyManager.detachCopy(myRetrievedInstance);
    

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多