Можно ли отсоединить только поле вместо целой сущности в JPA без использования переходного поля? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть два поля в определенном классе в моем приложении, и мне нужно применить свойство с именем scale, например, преобразование.В этом случае то, что будет показано на экране, не соответствует значению базы данных.

@Entity
@TableGenerator(...) 
public class Value implements Serializable {

    @Id
    @GeneratedValue(...)
    private Integer id;

    private Double start;  //Field to apply and reverse scale
    private Double end;    //Field to apply and reverse scale
    private Integer scale; //Scale that will be used...

    //GETTERS and SETTERS...

Итак, у меня есть две ситуации:

  1. Мне нужно применитьмасштабирование при загрузке объекта;
  2. И мне нужно изменить масштаб при сохранении / объединении / сохранении объекта

Итак, я разработал два метода обратного вызова для этой цели:

    @PrePersist
    @PreUpdate
    public void reverseScale() {
        start = start * scale;
        end = end * scale;
    }

    @PostPersist
    @PostUpdate
    @PostLoad
    public void applyScale() {
        start = start / scale;
        end = end / scale;
    }

Я знаю, что после загрузки объекта сущности все изменения в этой сущности будут управляться контекстом постоянства и автоматически обновляться в базе данных.Но в этом случае это проблема, я предполагал, что JPA будет запускать метод reverseScale (помеченный @PrePersist и @PreUpdate) только тогда, когда я на самом деле запускаю метод save, merge или persist из функции менеджера сущностей, но методвыполняется без выполнения функции менеджера сущностей, запускается сразу после загрузки списка объектов, возможно, из-за вызова какого-либо метода get или set.

Я пытался использовать стратегию AccessType, но не сделалработа:

@Access(AccessType.FIELD)
public class Value implements Serializable {

..
@Access(AccessType.PROPERTY)
public String getStart() {
    return start;
}

Боюсь, что переходное поле будет моим решением, но я пытаюсь избежать этого к тому времени.Что я могу сделать в этом случае?Мне нужно, чтобы метод applyScale выполнялся только один раз, когда я загружаю объект из базы данных, и ровно один раз - метод reverseScale, когда я (по моей воле) запускаю некоторый метод сохранения или обновления из entityManager.

Можно ли "отсоединить"поле вместо целой сущности?Еще один момент - не ставить эту «ответственность» на мои дао или классы бизнес-правил.Отделить всю сущность не очень хороший выбор в моем случае.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...