Как игнорировать какое-то поле объекта, когда кешируешь объект в весенней загрузке redis cache? - PullRequest
0 голосов
/ 28 марта 2019

Когда весенняя загрузка перерисовывает объект, я хочу игнорировать поля, аннотированные @MayToOne и @ OneToMany

Почему я хочу их игнорировать? Потому что в моем случае я должен их игнорировать, и это длинная история, я не хочу говорить об этом здесь.

Вот объект.

@Entity
@Table(name = "tga_project_application_record")
@Data
@EntityListeners(AuditingEntityListener.class)
public class ProjectApplicationRecord implements Serializable {
    private static final Long UID = 1L;


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @JsonIgnore
    @ManyToOne
    @JoinColumn(nullable = false)
    private User user;


    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    private Project project;


    private String processInstanceId;


    @Type(type = "json")
    @Column(columnDefinition = "json", nullable = false)
    private Object applicationInfo;


    @Column(nullable = false)
    private ApplicationStatus status;


    @Enumerated(EnumType.STRING)
    private RealTimeStatus realTimeStatus;


    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dynamic_form_id", nullable = false)
    private DynamicForm form;



    @Type(type = "json")
    @Column(columnDefinition = "json", nullable = false)
    private Set<ApplicationFile> applicationFiles;


    @CreatedDate
    private Timestamp createdAt;


    @LastModifiedDate
    private Timestamp updatedAt;
}

Я использую аннотации весеннего загрузочного кэша для кэшей управления. Вот часть того, как я использую эти аннотации для управления моим кешем.

@Caching(
            put = {@CachePut(value = "projectApplicationRecordCache", key = "#id")},
            evict = {
                    @CacheEvict(value = {"projectApplicationRecordPaginatedCache", "projectApplicationRecordListCache", "projectApplicationRecordCacheByProcessInstanceId"}, allEntries = true),
                    @CacheEvict(value = {"getByProjectIdAndUserIdIfThatRecordIsNormalCache"}, key = "{#result.project.id, #result.user.id}"),
            }
    )
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
    public ProjectApplicationRecord patchUpdate(Long id, ProjectApplicationRecord object) {
        apiUtilsService.notNull(object);
        noViolationUniqueConstraint(object);
        ProjectApplicationRecord fullRecord = getByIdForUpdate(id);
        apiUtilsService.merge(fullRecord, getSafeObj(fullRecord, object));
        return recordRepository.save(fullRecord);
    }


    @Caching(
            put = {@CachePut(value = "projectApplicationRecordCache", key = "#result.id")},
            evict = {
                    @CacheEvict(value = {"projectApplicationRecordPaginatedCache", "projectApplicationRecordListCache"}, allEntries = true),
                    @CacheEvict(value = "getByProjectIdAndUserIdIfThatRecordIsNormalCache", key = "{#result.project.id, #result.user.id}")
            }
    )
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
    public ProjectApplicationRecord create(ProjectApplicationRecord object) {
        apiUtilsService.notNull(object);
        noViolationUniqueConstraint(object);
        return recordRepository.save(getSafeObj(null, object));
    }

Спасибо вам всем И мой английский не очень хорош, простите меня, пожалуйста.

Может быть, я могу использовать собственный сериализатор для замены стандартного сериализатора spring-boot-data-redis для поддержки, игнорируя поля, аннотированные @MayToOne и @OneToMany?

...