1

我面临的实际问题是无论缓存的内容如何都能够强制进行 eclipselink 更新。当前,如果新更新与缓存中的值相同,eclipselink 不会创建新的更新语句。我不想<property name="eclipselink.query-results-cache" value="false"/>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();

如果我将上述更新(setState方法)更改为 sql 查询,那么查询对象可以选择执行 setHint,我们可以在其中提及setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache). 我也不能这样做,因为使用了很多这样的更新。

在上面的代码片段中,更新是使用 setter 方法进行的,在这种情况下,我们如何指定忽略缓存的提示?或者有没有其他方法可以使用 setter 对象进行强制更新?

我的问题与此类似:http: //www.eclipse.org/forums/index.php/m/660750/

4

3 回答 3

0

调用 topersist是不必要的。persist 用于使瞬态实体持久化和托管,并且您的实体已经是持久化和托管的。

我并没有真正看到将一行的所有列设置为其当前值的更新点。但是,如果您真的想触发这种不必要的更新,请考虑添加一个虚拟counter持久字段并增加它。EclipseLink 将检测其缓存值的变化,并触发更新。

于 2011-12-13T18:43:21.450 回答
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

尝试使用空值调用 setter,并使用您的预期值再次在同一字段上调用 ​​setter。然后该字段将在 Update 语句中进行跟踪。

于 2020-09-04T10:56:27.387 回答