Переходные поля не являются нулевыми после загрузки - PullRequest
0 голосов
/ 25 февраля 2019

Меня смущает удивительное поведение eclipselink 2.5.2.В тех же случаях переходные поля объекта устанавливаются с последним значением после загрузки объекта.С моей точки зрения, нет определения того, каким должно быть состояние переходных полей после загрузки (см. https://download.oracle.com/otn-pub/jcp/persistence-2.0-fr-oth-JSpec/persistence-2_0-final-spec.pdf?AuthParam=1551111289_d4f5a797aa325dac1adb64fb8b75c2af). Кто-нибудь может объяснить это поведение? Я сохраняю поведение и устанавливаю все поля @Transient в аннотированном @PostLoadметод к нулю.

@Entity
@Cacheable(true)
@Cache(expiry = 300000)
@Table(uniqueConstraints=@UniqueConstraint(name = "uc_b_a_v", columnNames = {"a_id", "v"}))
public class Entity {

    @Transient
    private String transientfield;  

    @PostLoad
    public void onPostLoad() {
        transientfield = null;
    }
}

1 Ответ

0 голосов
/ 26 февраля 2019

Это сообщение с форума eclipselink очень хорошо объясняет поведение: https://www.eclipse.org/forums/index.php/t/206082/

EclipseLink по умолчанию включает общий кэш.Этот общий кэш может поддерживать временные переменные или нет.

Если используется переплетение, объекты общего кэша клонируются в / из контекста постоянства, таким образом сохраняя состояние временных переменных.

Если плетение не используется, то новые экземпляры создаются в контексте постоянства, а непереходное состояние (только) копируется из общего объекта.

Итак, если вы не хотитепереходные процессы кэшируются, тогда вы можете отключить внутреннее ткачество ("eclipselink.weaving.internal" = "false"), это все равно позволит ткачество для LAZY и отслеживание изменений.

Вы также можете отключить общий кэш, полностью отключить переплетение, настроить CopyPolicy своей сущности или использовать DescriptorEvent postClone / postMerge.

...