2011-12-13 3 views
1

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

Если я изменяю выше обновление (метод 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

+0

@Nizet, было ли ваше предложение добавить новый счетчик в сущности, а также новый столбец в таблице? Есть ли другое решение, кроме изменения объекта? – user1096318

+0

EntityManager em = getEntityManager(); \t \t EntityTransaction t = em.getTransaction(); \t \t \t \t t.begin(); \t \t \t \t Ticket ticket = get (ticketId); \t \t em.обновить (билет); \t \t \t \t если (нулевой билет ==) { \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 (entity)? \t \t Есть ли другой способ использования подсказок/свойств, чтобы каждое обновление обновлялось. – user1096318

0

Использование 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); 
     } 

} 

Затем определяют Customizer для класса Entity:

@Entity 
@Customizer(com.oracle.ticketsystem.customizer.TicketCustomizer.class) 
public class Ticket implements Serializable {......}