2011-01-07 2 views
1

В попытке найти другую проблему мои тесты придумали следующий бит кода.Поля установки Datanucleus JDO равны нулю

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. Данные хранятся в базе данных. Любые идеи? Может ли кто-нибудь подтвердить это. использованием СДО-API-3.0.jar DataNucleus-ядро-2.2.0-release.jar DataNucleus-энхансер-2.1.3.jar DataNucleus-RDBMS-2.2.0-release.jar MySQL-разъем-Java -5.1.13.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

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

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

+0

Похоже, у меня есть кое-что для чтения. Думал, что я могу просто сохранить классы в базе данных, и это был конец, очевидно, нет. – aronp

+0

пс. Спасибо, спасли много душевной боли. – aronp

0

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

MyClass copy = myPersistencyManager.detachCopy(myRetrievedInstance); 
Смежные вопросы