2017-12-30 25 views
0

新しいオブジェクトは、オブジェクトプロパティに設定しようとするたびに作成されます。誰かにこれを再現させる。それはデフォルトの動作ですか?設定1-1既存のオブジェクトとの関係は、JDOを使用する代わりに新しいオブジェクトを挿入しますか?

public class ProductClass implements Serializable { 
... 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
long id; 
@Persistent 
private String name = null; 
... 
} 


public class Product implements Serializable { 
... 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
long id; 
@Persistent 
private String name = null; 
@Persistent(defaultFetchGroup = "true") 
private ProductClass productClass = null; 
... 
} 

これは私が私のProductClassNeo4jServiceを実装することにより、データベースからのProductClassを取得する方法です。

@Override 
public ProductClass findById(Long id) { 
    if (id == null) { 
     return null; 
    } 
    PersistenceManager pm 
      = JDOUtil.PERSISTENCE_MANAGER_FACTORY.getPersistenceManager(); 
    ProductClass prod = null; 

    try { 
     prod = (ProductClass) pm.getObjectById(ProductClass.class, id); 
    } finally { 
     pm.close(); 
    } 
    return prod; 
} 

... 
ProductClass prodClass = productClassNeo4jService.findById(id); 

このように製品を保存する。

... 
Product prod = new Product(); 
prod.setName('productName'); 
prod.setProductClass(prodClass); 

PersistenceManager pm = JDOUtil.PERSISTENCE_MANAGER_FACTORY.getPersistenceManager(); 
Transaction tx = pm.currentTransaction(); 
try { 
tx.begin(); 
pm.makePersistent(prod); 
Object id = pm.getObjectId(prod); 
tx.commit(); 
} finally { 
    if (tx.isActive()) { 
     tx.rollback(); 
    } 
    pm.close(); 
} 
... 

ProductClassをProductに設定する代わりに、新しいProductClassが生成されます。私は間違って何をしていますか?

+0

"非文字列オブジェクト"とは何ですか?あなたは1-1の関係があります! 'prodClass'はどこに作られていますか? 'makePersistent'を呼び出す時点では、どのようなオブジェクトライフサイクル状態ですか?そのすべてはJDOの仕様と適切なJDOのマニュアルで定義されています – DN1

+0

@ DN1ありがとう、私は 'prodClass'をどのように取得するのかを追加しました。 productClassは既に作成されています。新しい商品を作成するには、商品は1つの商品クラスに属していなければなりません。つまり、あなたが言ったように1-1関係です。右? – Hopecee

+0

これはトランザクション外で検索されたため、TRANSIENTですか?またはデタッチ? – DN1

答えて

0

アタッチ/デタッチというJDO 2.0のおかげで、他の場所で使用するためにオブジェクトを切り離し、オブジェクト内の変更されたデータを保持したいときにアタッチすることができます。得られたProductClassはそれを切り離さずに役に立たなかった。 @ DN1に感謝します。 ProductClassをデタッチするコードを、行を追加して変更しました。

このようになります。

@Override 
public ProductClass findById(Long id) { 
    if (id == null) { 
     return null; 
    } 
    PersistenceManager pm 
      = JDOUtil.PERSISTENCE_MANAGER_FACTORY.getPersistenceManager(); 
    Transaction tx = pm.currentTransaction(); 

    ProductClass prod = null; 

    try { 
     tx.begin(); 

     prod = (ProductClass) pm.getObjectById(ProductClass.class, id); 
     // Detach our productClass object for use elsewhere 
     prod = pm.detachCopy(prod); 

     tx.commit(); 
    } finally { 
     if (tx.isActive()) { 
      tx.rollback(); 
     } 
     pm.close(); 
    } 
    return prod; 
} 

便宜上、javax.jdo.option.DetachAllOnCommit = trueをPMFオプションに追加してください。

実際に問題が発生したのは、私がこれらのすべてを外部で行っていたことです。トランザクションpersistence.xmljavax.jdo.option.DetachAllOnCommitを追加すると、Transactionの場合にのみ機能します。

+0

トランザクションを使用している場合は、 'detachCopy'は必要ありません。そしてトランザクションなしでそれをやっているのであれば、 'datanucleus.detachOnClose'を設定すれば、PMを閉じる​​ときにすべての読み込みオブジェクトが切り離されます。 – DN1

+0

@ DN1はい。私はそれを観察した。なぜそれが切り離されていないのかを知るために、時間がかかり、援助が必要でした。ありがとう。 – Hopecee

+0

私は 'persistence.xml'で' datanucleus.DetachAllOnCommit = true'と 'datanucleus.detachOnClose = true'の両方を設定することに矛盾がありますか? – Hopecee

関連する問題