2011-12-13 39 views
1

我面臨的實際問題是無論緩存的內容如何,​​都可以強制進行eclipselink更新。如果新更新的值與緩存中的值相同,則當前eclipselink不會創建新的更新語句。我不想在持久性xml中使用刷新屬性( )。eclipselink提示setter更新

我正在尋找一種解決方案,我可以指定正在更新的實體不使用緩存中的值。

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

如果我改變上述更新(的setState方法)到一個SQL查詢,然後將查詢對象有一個選項做setHint在那裏我們可以提到setHint(QueryHints.CACHE_USAGE,CacheUsage.DoNotCheckCache)。我無法做到這一點,因爲有很多這樣的更新使用。

在上面的代碼片段中,使用setter方法進行更新,在這種情況下,我們如何指定忽略緩存的提示?或者有沒有其他方法可以使用setter對象來執行強制更新?

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

在此先感謝您。

回答

0

persist的呼叫是不必要的。 persist用於使臨時實體持久化並進行管理,並且您的實體已經被持久化和管理。

我真的沒有看到更新的重點,它會將行的所有列設置爲當前值。但是如果你真的想要觸發這樣一個不必要的更新,可以考慮添加一個虛擬counter持久字段並遞增它。 EclipseLink將檢測到其緩存值的變化,並會觸發更新。

+0

是啊,我現在已經刪除了堅持通話。我想用同一組值更新的原因是因爲狀態字段有可能從不同的來源被操縱。在這種情況下,我希望狀態字段也從應用程序更新。目前它不會發生,因爲eclipselink緩存不知道直接更改。你能給我一個使用虛擬櫃檯的例子嗎? – user1096318 2011-12-13 18:54:59

0

使用DescriptorCustomizer我能夠覆蓋從eclipselink生成的更新sql。下面是示例snipppet。但是這需要很多代碼更改。如果你們中的任何一個人知道通過使用一些註釋或一些配置文件更改來減少干擾的方式,請讓我知道。

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 {......}