eclipselink подсказки для обновлений сеттера - PullRequest
1 голос
/ 13 декабря 2011

Фактическая проблема, с которой я сталкиваюсь, заключается в возможности принудительного обновления eclipselink независимо от содержимого кэша.В настоящее время eclipselink не создает новые операторы обновления, если новое обновление имеет то же значение, что и в кэше.Я не хочу использовать свойство refresh () в постоянном 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).Я тоже не могу этого сделать, так как используется много таких обновлений.

В приведенном выше фрагменте обновление происходит с использованием метода установки, в этом случае, как мы указываем подсказку для игнорирования кэша?Или есть какой-либо другой способ принудительного обновления с использованием объекта установки?

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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Используя DescriptorCustomizer, я смог переопределить обновление sql, сгенерированное из eclipselink.Ниже приведен образец сниппета.Но для этого нужно много изменений кода.Если кто-либо из вас знает способ сделать это менее навязчиво, используя некоторые аннотации или изменения файла конфигурации, пожалуйста, дайте мне знать.

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 {......}
0 голосов
/ 13 декабря 2011

Звонок на persist не нужен.persist используется, чтобы сделать временный объект постоянным и управляемым, а ваш объект уже постоянным и управляемым.

Я не вижу смысла в обновлении, которое установило бы все текущие столбцы строки в их текущее состояние.значение.Но если вы действительно хотите вызвать такое ненужное обновление, подумайте о добавлении фиктивного counter постоянного поля и увеличении его.EclipseLink обнаружит изменение своего кэшированного значения и запустит обновление.

...