Обновить формулу гибернации - PullRequest
2 голосов
/ 26 марта 2011

У меня есть две сущности (пример максимально уменьшен; у каждой сущности есть поле идентификатора):

@Entity
public class A {
    @Column(nullable = false)
    private double foo;

    @Formula(value = "foo - (select coalesce(sum(x.foo), 0) from x where x.a_id = id)")
    private double bar;
}

и

@Entity
public class X {
    @ManyToOne(optional = false)
    private A a;

    @Column(nullable = false)
    private double foo;
}

Когда я создаю новый X (new X(), beginTransaction(), save(x), commit()) значение A.bar не обновляется.

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

РЕДАКТИРОВАТЬ: По запросу здесь код для сохранения X -объектов:

// setters
getSession().beginTransaction(); // getSession() returns the current session
getSession().save(entity); // entity is an instance of X
getSession().getTransaction().commit();

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Session.clear удалит все кэшированные объекты из сеанса.вместо этого вы можете использовать метод evict в сеансе и указать объект, который удаляет только указанный объект из кэша.

0 голосов
/ 27 марта 2011

Я пытался решить проблему с очисткой кеша, но за этим последовали новые проблемы и сделал кеш более или менее бесполезным, потому что X меняются довольно часто. (На самом деле подвыбор гораздо сложнее, чем показано в вопросе. Он использует больше таблиц.)

Теперь я использую StatelessSession, который не имеет кеша первого уровня. Это решает проблему. Поскольку база данных является встроенной базой данных h2, регрессия производительности не заметна.

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