Как синхронизировать данные с JPA между сущностями в кеше сеанса? - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь выяснить, как синхронизировать данные в кеше сеанса.У меня есть следующий пример:

@Table (name = "language")
@Entity
public class Language
{
    @Id
    @Column (name = "key", unique = true, nullable = false)
    private String key;

    @Column (name = "name", unique = true, nullable = false)
    private String name;

    @OneToMany (mappedBy = "language", cascade = { CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE })
    private Set<Translation> translations;
}


@Table (name = "translation")
@Entity
public class Translation 
{
    @Id
    @GeneratedValue (strategy = GenerationType.SEQUENCE)
    private Long id;

    @ManyToOne(optional = false)
    private Language language;

    @ManyToOne (optional = false)
    @JoinColumn(referencedColumnName = "key")
    private TranslatableEntity translatable;

    @Column(name = "value")
    private String value;
}


@Table (name = "translatable")
@Entity
public class Translatable
{
    @Id
    @GeneratedValue (strategy = GenerationType.SEQUENCE)
    private Long id;

    @NotNull
    @Size (max = 255)
    @Column (name = "key", unique = true, nullable = false)
    private String key;

    @OneToMany (mappedBy = "translatable", cascade = { CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
    @MapKey (name = "language")
    private Map<Language, Translation> translations;
}

Так что в основном я делаю:

// Print current translations for en language
Language language = languageRepository.getOne("en");
printTranslations(language);

// Add new translatable object with translation for english language
Translatable translatable = new Translatable();
translatable.addTranslation("en", "...")
translatableRepository.saveAndFlush(translatable)

// Again print translations for en language
// This still prints outdated information
language = languageRepository.getOne("en");
printTranslations(language);

Поэтому мой вопрос заключается в том, как сохранить согласованность данных.

При вставке / удаленииВ новом переводе с некоторыми переводами список переводов в экземплярах Language не обновляется в кеше сеанса.Я не мог найти удовлетворительного ответа на это.Этот был ближе всего: Синхронизация отношений между сущностями при удалении потомка в JPA .

Спасибо

1 Ответ

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

JPA не поддерживает две стороны двунаправленных отношений для вас.И цель кэша первого уровня заключается в том, что внутри транзакции объекты загружаются только один раз.

Это дает вам два варианта решения проблемы:

  1. поддерживает обе сторонысамих отношений, например, путем реализации метода Translatable.add, чтобы он обновлял Language.translations и Translation.language

  2. , чтобы принудительно перезагрузить language, либо изгнав его, либозакрытие сессии (т.е. транзакции) перед вызовом languageRepository.getOne("en")

...