Datanucleus JDO устанавливает нулевые поля - PullRequest
1 голос
/ 07 января 2011

В попытке найти другую проблему в моих тестах был обнаружен следующий фрагмент кода:

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);
 }
}

, где второе утверждение не удается.то есть.мой объект, который я прошу сохранить, изменяется вызовом makePersistent.Данные хранятся в базе данных.Есть идеи?Может ли кто-нибудь это подтвердить.использование jdo-api-3.0.jar datanucleus-core-2.2.0-release.jar datanucleus-Enhancer-2.1.3.jar

в затмении с базой данных 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

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Почему вы получаете доступ к полям напрямую? Класс доступа объявлен как PersistenceAware? Ну, это не так, вы не можете сделать это - используйте добытчики. Что такое состояние объекта "ud" до того, как оно сохранится? (переходный?) что это после упорствовать? (пусто?) Что говорит журнал? Скорее всего, он находится в пустом состоянии, а затем вы получаете доступ к полю напрямую, и он не имеет значения (по определению, согласно спецификации) ... но, поскольку вы не удосужились вызвать геттер, у него нет шансов получить Значение. И, вероятно, у вас также не установлено постоянное свойство "RetainValues"

Предлагаем вам ознакомиться со спецификацией JDO и состояниями жизненного цикла объекта

0 голосов
/ 13 сентября 2013

В некоторых случаях необходим прямой доступ к атрибутам десериализованных объектов (т. Е. При использовании библиотеки GSON для сериализации JSON). В этом случае вы можете использовать:

MyClass copy = myPersistencyManager.detachCopy(myRetrievedInstance);
...