2011-01-07 6 views
1

別の問題を見つけるために、私のテストでは以下のコードを使用しました。Datanucleus JDOが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); 
} 
} 

ここで、2番目のアサートは失敗します。すなわち、永続化されることを求めている私のオブジェクトは、makePersistent呼び出しによって変更されています。データはデータベースに保存されています。 アイデア誰でもこれを確認できますか? JDO-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

ps。ありがとう、心苦しいものをたくさん保存しました。 – aronp

0

に慣れる提案する、それが直接デシリアライズされたオブジェクトにアクセスするために必要な属性である(すなわち設定されていません。 JSONシリアライゼーションにGSONライブラリを使用している場合)。その場合は次のように使用できます:

MyClass copy = myPersistencyManager.detachCopy(myRetrievedInstance); 
関連する問題