1

私が直面している実際の問題は、キャッシュの内容に関係なく、eclipselink の更新を強制できることです。現在、eclipselink は、新しい更新がキャッシュ内と同じ値を持つ場合、新しい更新ステートメントを作成しません。<property name="eclipselink.query-results-cache" value="false"/> で refresh プロパティ( )を使用したくありませんpersistence.xml

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

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();

上記の update (setStateメソッド) を sql クエリに変更すると、クエリ オブジェクトには setHint を実行するオプションがあり、setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache). このような更新がたくさん使用されているため、これもできません。

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

私の問題はこれに似ています: http://www.eclipse.org/forums/index.php/m/660750/

4

3 に答える 3

0

DescriptorCustomizer を使用して、eclipselink から生成された更新 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 クラスのカスタマイザーを定義します。

@Entity
@Customizer(com.oracle.ticketsystem.customizer.TicketCustomizer.class)
public class Ticket implements Serializable {......}
于 2011-12-15T19:40:36.207 に答える
0

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

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

于 2011-12-13T18:43:21.450 に答える