2011-12-13 3 views
1

私が直面している実際の問題は、キャッシュの内容に関係なくeclipselinkを強制的に更新できることです。現在、eclipselinkは、新しい更新プログラムがキャッシュ内の値と同じ値を持つ場合、新しい更新ステートメントを作成しません。永続性のxmlでリフレッシュ・プロパティー( )を使用したくありません。eclipselinkセッター更新のヒント

キャッシュ内の値を使用しないように更新するエンティティを指定できるソリューションを探しています。

EntityManager em=getEntityManager(); 
    EntityTransaction t = em.getTransaction(); 

    t.begin(); 

    Ticket ticket = get(ticketId); 

    if(ticket == null) { 
     return null; 
    } 

    ticket.setState(status); 

    em.persist(ticket); 
    t.commit(); 

私はSQLクエリに上記の更新(SETSTATE方法を)変更する場合は、クエリオブジェクトは、我々はsetHint(QueryHints.CACHE_USAGE、CacheUsage.DoNotCheckCache)を挙げることができるsetHintを行うためのオプションがあります。私はこのような更新がたくさんあるので、これを行うことはできません。

上記のスニペットでは、セッターメソッドを使用して更新が行われていますが、このシナリオではキャッシュを無視するヒントをどのように指定しますか?または、セッターオブジェクトを使用して強制更新を行う他の方法はありますか?

My problem is similar to this : http://www.eclipse.org/forums/index.php/m/660750/ 

ありがとうございます。

答えて

0

persistへの呼び出しは不要です。 persistは、一時的なエンティティを永続的に管理するために使用され、エンティティはすでに永続的に管理されています。

行のすべての列を現在の値に設定する更新ポイントが実際に表示されません。しかし、本当にそのような不要な更新をトリガーしたい場合は、ダミーのフィールドを追加してインクリメントすることを検討してください。 EclipseLinkはキャッシュされた値から変更を検出し、更新をトリガーします。

+0

うん、私は今、存続の呼び出しを削除しました。同じ値のセットで更新したいのは、異なるソースから状態フィールドを操作する可能性があるからです。このシナリオでは、アプリケーションから状態フィールドも更新する必要があります。現時点では、eclipselinkキャッシュは直接的な変更を認識していないため、発生しません。ダミーのカウンターを使用する例を教えてください。 – user1096318

+0

@ Nizet、エンティティに新しいカウンタを追加し、テーブルの新しい列を追加することをお勧めしましたか?エンティティを変更する以外の方法がありますか? – user1096318

+0

EntityManager em = getEntityManager(); \t \t EntityTransaction t = em.getTransaction(); \t \t \t \t t.begin(); \t \t \t \tチケットticket = get(ticketId); \t \t em。リフレッシュ(チケット); \t \t \t \t場合(チケット== NULL){ \t \t \t戻りヌル。 \t \t} \t \t \t \t ticket.setState(ステータス)。 \t \t \t \t \t \t t.commit(); \t \t返品チケット; \t \t \t \t em.refresh(チケット)を追加するとすぐに動作します。 em.refresh(エンティティ)を使用することに不利な点はありますか? \t \tヒント/プロパティを使用して毎回新しい更新を確実に行う方法はありますか? – user1096318

0

DescriptorCustomizerを使用して、eclipselinkから生成されたupdate sqlをオーバーライドすることができました。以下はサンプルスニペットです。しかし、これには多くのコード変更が必要です。あなたの誰かが、いくつかの注釈や設定ファイルの変更を使って、これをあまり邪魔しないようにする方法を知っているなら、私に知らせてください。

import org.eclipse.persistence.config.DescriptorCustomizer; 
import org.eclipse.persistence.descriptors.ClassDescriptor; 

public class TicketCustomizer implements DescriptorCustomizer{ 
    public void customize(ClassDescriptor descriptor) { 

    String sqlString="update Ticket set DESCRIPTION = #DESCRIPTION, CUSTOMERNAME=#CUSTOMERNAME ,STATE= #STATE where ID = #ID and PRODUCTID= #PRODUCTID" ; 

     descriptor.getQueryManager().setUpdateSQLString(sqlString); 
     } 

} 

そして、エンティティクラスのカスタマイザーを定義します。

@Entity 
@Customizer(com.oracle.ticketsystem.customizer.TicketCustomizer.class) 
public class Ticket implements Serializable {......} 
関連する問題