2011-01-07 5 views
1

In einem Versuch, ein anderes Problem zu finden, kamen meine Tests mit dem folgenden Bit Code.Datanucleus JDO setzt Felder auf null

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

wo die zweite Assert fehlschlägt. dh. Mein Objekt, das ich persistieren möchte, wird durch den makePersistent-Aufruf geändert. Die Daten werden in der Datenbank gespeichert. Irgendwelche Ideen? Kann das jemand bestätigen? Verwendung 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

in Eclipse mit MySql-Datenbank.

@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 + "]"; 
} 



} 

Properties-Datei ist

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 

Antwort

2

Warum zugreifen Sie Felder direkt? Wird die zugreifende Klasse als PersistenceAware deklariert? Nun, es ist nicht so, dass du das nicht tun kannst - benutze die Getters. Was ist "Ud" -Objektstatus bevor persist? (transient?) Was ist nach dem Fortbestehen? (hohl?) Was sagt der Baumstamm? Wahrscheinlichkeiten sind, dass es im hohlen Zustand ist und Sie dann direkt auf ein Feld zugreifen und es hat keinen Wert (per Definition, gemäß der Spezifizierung) ... aber da Sie den Getter nicht genannt haben, hat es keine Chance, zurückzurufen der Wert. Und Sie wahrscheinlich auch nicht „RetainValues“ persistent Eigenschaft

gesetzt

vorschlagen Sie sich mit den Lifecycle-Staaten JDO-Spezifikation und Objekt vertraut

+0

Klingt, als hätte ich etwas zu lesen. Ich dachte, ich könnte nur Klassen in der Datenbank speichern und das war das Ende, offensichtlich nicht. – aronp

+0

ps. Danke, viel Kummer gerettet. – aronp

0

In einigen Fällen ist es notwendig, entserialisierten Objekte für den Zugriff auf Attribute direkt (dh wenn GSON-Bibliothek für JSON-Serialisierung verwendet wird). In diesem Fall können Sie verwenden:

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