1

別の問題を見つけようとして、私のテストでは次のコードが思いつきました。

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-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

MySqlデータベースを使用したEclipseで。

@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
4

2 に答える 2

2

フィールドに直接アクセスするのはなぜですか? アクセスするクラスは PersistenceAware として宣言されていますか? そうではないので、それを行うことはできません - ゲッターを使用してください。永続化前の「ud」オブジェクトの状態とは何ですか? (一時的?) 持続後は何ですか? (中空?) ログは何と言っていますか? 中空の状態にある可能性があり、フィールドに直接アクセスし、値がありません (仕様によると、定義により) ... しかし、わざわざゲッターを呼び出さなかったので、取得する機会がありません値。また、「RetainValues」永続プロパティ セットも持っていない可能性があります。

JDO の仕様とオブジェクトのライフサイクルの状態に慣れることをお勧めします

于 2011-01-08T07:33:09.033 に答える