質問
そのための最も簡単な方法は取り外し特定のJPA者豆として取得されたもので、EntityManager.或いは、このクエリー式を返し一戸建ての物のう本質的に法として読み取りのみ'?
なぜこういう仕事がしたいで足がしたいデータの内のbeanで申し込んだものの、今までになかで持続的にデータベースです。私のプログラムでは、最終的にコflush()のEntityManager、継続するでしょうすべての変化から付属の団体のunderylingデータベースが除外したい特定のオブジェクト。
解決
残念ながら、切断につオブジェクトのマネージャーの現在のJPAを実施AFAIR.
EntityManager.clear()の切断 すべての にJPA物ではできない可能性のある適切な解決すべての場合には、い物をする接続します。
その最良のベットするクローンのオブジェクトのクローンのコードを変更します。以来、プリミティブ変更不能なオブジェクト分野を取り扱ってデフォルトのクローニング機構を適切な方法でなければいけませんが書に多くの配管コード以外のものから深いクローニング合計構造物のしょう)。
他のヒント
(なるのでは遅すぎるとの回答がのために活用できるその他)
私は開発の最初のシステムJPAます。残念ながら私はこの問題をこのシステムはほぼ完了します。
け入れます。利用HibernateやJPA2.0にアクセスしてください。
にHibernateを使用でき'です。退(オブジェクト)'マップオブジェクトです。に JPA2.0, に案の現在, あのEntityManager.取り外し(オブジェクト)'メソッドを取り外しにつオブジェクトからの継続コンテキスト
いずれにJPAを実装を使用は、利用 entityManager.detach(object)
現在ではJPA2.0のJEE6.
が必要な場合は切り離し、オブジェクトからのEntityManager、ご利用のHibernateとして裏付ORM層までのアクセス Hibernateのセッション オブジェクトを使用し セッション。退(オブジェクト) 法Mauricio金田。
public void detach(Object entity) {
org.hibernate.Session session = (Session) entityManager.getDelegate();
session.evict(entity);
}
もちろんこのク上で稼働している場合に切り替えもORMプロバイダがこのが好ましくるとして生まれ変わろうとしている深いコピーします。
私が知る限りでは、直接ついて
- コミットのtxn-どのように変動するという合理的なオプション
- 明らかに持続コンテキストEntityManager.clear()この残忍なものが明確で
- コピーのオブジェクトにおJPA物を直列化可能なすべきで行ってくださいますようお願いそうでない場合は特に効率的に).
を使用する場合は EclipseLink
ものではありませんのオプション
軒のクエリのヒント eclipselink.maintain-cache"="false
-すべて返されるフラッシュすることはありません。
をご利用 EclipseLink
JpaEntityManager
copy()
APIのコピーのオブジェクトを希望する。
場合はあまりありませんの豆、そばの作成新しいインスタンスは完全に文書化されていて、その手からの続き。
この実施可能としてコピーコンストラクタは、例えば:
public Thing(Thing oldBean) {
this.setPropertyOne(oldBean.getPropertyOne());
// and so on
}
その後:
Thing newBean = new Thing(oldBean);
この、あるいは汚することができますserializeおよび直列化復元のオブジェクトです。
以降を使用してい縫い目とJPA1.0、私のシステムはfuctinalityるニーズにログインすべての分野に変化を生み出している値オブジェクトまたはデータ転送オブジェクトの場合と同じ分野の企業のニーズがログ収集されます。コンストラクタのpojoです:
public DocumentoAntigoDTO(Documento documentoAtual) {
Method[] metodosDocumento = Documento.class.getMethods();
for(Method metodo:metodosDocumento){
if(metodo.getName().contains("get")){
try {
Object resultadoInvoke = metodo.invoke(documentoAtual,null);
Method[] metodosDocumentoAntigo = DocumentoAntigoDTO.class.getMethods();
for(Method metodoAntigo : metodosDocumentoAntigo){
String metodSetName = "set" + metodo.getName().substring(3);
if(metodoAntigo.getName().equals(metodSetName)){
metodoAntigo.invoke(this, resultadoInvoke);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
にJPA1.0(試験用EclipseLink)きを取得する者以外の取引はない。例えば、コンテナにお客さまの利益を不当になにができる:
public MyEntity myMethod(long id) {
final MyEntity myEntity = retrieve(id);
// myEntity is detached here
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public MyEntity retrieve(long id) {
return entityManager.find(MyEntity.class, id);
}
いう類例を生み出していDTOオブジェクトの永続的な企業オブジェクトとして
class MyEntity
{
public static class MyEntityDO extends MyEntity {}
}
最後に、スカラーのままのクエリを取得希望の非営属性:
(Hibernate) select p.id, p.name from MyEntity P
(JPA) select new MyEntity(p.id, p.name) from myEntity P
だがここで実際にいる者に渡るリモートの境界をまだ一部のコードを馬鹿にhibernazi.
for(RssItem i : result.getChannel().getItem()){
}
複製可能な隠作業で実際にコピーするPersistantBag。
とを忘れがちに使用を直列化およびメッセージをbytearrayストリームやパイプによるフレームワークスレッドを避けるデッドロック-殺全体のコンセプト。
と思う方法はありますので立ち退かせ、単一エンティティからEntityManagerを呼び出す
EntityManagerFactory emf;
emf.getCache().evict(Entity);
この取り特定の組織から。
思いますので使用方法EntityManager.リフレッシュ(Object o)の場合主キーの主体は変更されました。このメソッドを回復元の状態にする。