Запрос внутри собственного валидатора - PullRequest
0 голосов
/ 07 апреля 2011

Я написал аннотацию ограничения JSR-303 уровня класса, которая принимает имя метода в качестве параметра. Имя метода, заданное вами в качестве параметра, должно возвращать логическое значение.

У меня есть сущность Foo с полями code, validFrom и validTill. Код должен быть уникальным в любое время. Пример: два объекта («AAA», 1.1.2010, 31.12.2010) и («AAA», 1,5.2011, 31.5.2011) в порядке две сущности («AAA», 1.1.2010, 31.12.2010) и («AAA», 1.2.2010, 31.3.2012) НЕПРАВИЛЬНЫ

Теперь мне нужно написать метод проверки, который проверяет, является ли код уникальным. Я написал:

    public boolean isUnique() {
    if (logger.isDebugEnabled()) logger.debug("Before select");
    return entityManager.createQuery("select count(o) from Currency o where " +
            "o.code = :code and (" +
            "(o.validFrom between :validFrom and :validTill) or " +
            "(o.validTill between :validFrom and :validTill) or " +
            "(:validFrom between o.validFrom and o.validTill))",
            Long.class)
            .setParameter("code", getCode())
            .setParameter("validFrom", getValidFrom())
            .setParameter("validTill", getValidTill())
            .getSingleResult() == 0;
}

Я попал в совершенно бесконечный цикл

DEBUG http-8080-2 ch.laic.bsatrak.domain.base.BaseEntity - Before select
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - processing flush-time cascades
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - dirty checking collections
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
DEBUG http-8080-2 org.hibernate.pretty.Printer - listing entities:
DEBUG http-8080-2 org.hibernate.pretty.Printer - ch.laic.bsatrak.domain.base.Currency{id=50, createdBy=, editedBy=, createdAt=2011-04-07T14:54:52.233+02:00, validFrom=2010-01-01T00:00:00.000+01:00, code=CODE, validTill=2010-12-31T00:00:00.000+01:00, suspended=false, version=0, editedAt=null}
DEBUG http-8080-2 org.hibernate.engine.ActionQueue - changes must be flushed to space: bs_currency
DEBUG http-8080-2 ch.laic.bsatrak.domain.base.BaseEntity - Before select
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - processing flush-time cascades
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - dirty checking collections
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
DEBUG http-8080-2 org.hibernate.event.def.AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
DEBUG http-8080-2 org.hibernate.pretty.Printer - listing entities:
DEBUG http-8080-2 org.hibernate.pretty.Printer - ch.laic.bsatrak.domain.base.Currency{id=50, createdBy=, editedBy=, createdAt=2011-04-07T14:54:52.233+02:00, validFrom=2010-01-01T00:00:00.000+01:00, code=CODE, validTill=2010-12-31T00:00:00.000+01:00, suspended=false, version=0, editedAt=null}

Как я могу сделать это правильно?

1 Ответ

0 голосов
/ 08 апреля 2011

Необходимо установить FlushMode. По умолчанию установлено значение «Авто», и перед обработкой запросов попытайтесь сбросить все объекты, которые могут повлиять на запрос.

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