Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > @CollectionOfElements


Автор: polosatij 21.1.2009, 23:25

 smile  smile  smile 


при вызове delete приложение падает на 

Код

    @CollectionOfElements(fetch = FetchType.EAGER)
    @IndexColumn(name = "route_ind")
    public List < String > getFixIdentifiers() {
        return mFixIdentifiers;
    }


ошибка:

Код

org.springframework.dao.DataIntegrityViolationException: could not execute update query; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute update query
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:634)
...


описание траблы: каскадное удаление. попробовал поиграться с @OnDelete и @Cascade(value = { CascadeType.ALL }), @Cascade(value = { CascadeType.DELETE })

в гоогле уже 1.5 часа рыскаю, везде только вопрос на ответ, нигде ответа не могу найти  smile  smile  smile 

Автор: polosatij 22.1.2009, 00:07
в общем, пошёл таким путём.. достаю объект, говорю ему, коллекция твоя null и update её сначала в бд, потом делаю delete на объекте.. 
всё, чики пики   smile 

тока как-то это грязно и мне не очень нравится  smile  smile 

Автор: ivg 22.1.2009, 03:12
JPA-EntityManager, standalone приложение, MySQL 5.x: указанная конструкция работает как надо и при удалении в том числе. М.б. не в этом дело? А вообще мало инфы  smile 

Автор: polosatij 22.1.2009, 03:39
Цитата(ivg @  22.1.2009,  03:12 Найти цитируемый пост)
А вообще мало инфы


EJB3, JBoss, Postgresql..

а чёрт.. я не кинул таблицы.. у меня foreign key с одной таблицы на другую.. завтра на работе смогу описать.. smile

Автор: ivg 22.1.2009, 11:55
Цитата(polosatij @  22.1.2009,  05:39 Найти цитируемый пост)
EJB3

Цитата(polosatij @  22.1.2009,  01:25 Найти цитируемый пост)
org.springframework.dao.DataIntegrityViolationException:

Интересно как это всё работает.... smile

Цитата(polosatij @  22.1.2009,  01:25 Найти цитируемый пост)
при вызове delete

org.hibernate.Session#delete() ?

Цитата(polosatij @  22.1.2009,  05:39 Найти цитируемый пост)
а чёрт.. я не кинул таблицы.. у меня foreign key с одной таблицы на другую..

Это то понятно. Полный стек-трэйс? Конфиги? Исходник класса сущности? show_sql включили? Есть запрос на удаление из связанной таблицы?
Ну и всё таки, зачем вам Spring здесь нужен?

Автор: polosatij 22.1.2009, 13:41
Цитата(ivg @  22.1.2009,  11:55 Найти цитируемый пост)
Интересно как это всё работает.... smile


а чёрт  smile видать поздно было  smile 

Exception конечно же кидает Spring, т.к. с помощью него написаны тесты и он чистит таблицы. а EJB3 он вызывает через Remote интерфейс smile


Цитата(ivg @  22.1.2009,  11:55 Найти цитируемый пост)
org.hibernate.Session#delete() ?


Код

    /**
     * Removes specified entity.
     *
     * @param pEntityName - entity name to delete.
     * @param pIdentifier - Aerodrome identifier.
     */
    public void deleteEntity(final String pEntityName, final String pIdentifier) {

        final Bridge bridge = Bridge.getSingleton();

        bridge.getHibernateTemplate().execute(new HibernateCallback() {
            /** {@includeDoc} */
            @SuppressWarnings("synthetic-access")
            public Object doInHibernate(final Session pSession) {
                final StringBuilder hql = new StringBuilder();
                hql.append(String.format("delete from %1$s as a where a.identifier = :identifier", pEntityName));

                final Query query = pSession.createQuery(hql.toString());
                query.setParameter("identifier", pIdentifier);

                final int size = query.executeUpdate();

                if (bridge.isDebug()) {
                    LOG4J.debug("Deleted '" + size + "' elements (" + pEntityName + " Snapshot); "
                            + "Identifier: " + pIdentifier);
                }

                return null; // delete has nothing to return
            }
        });
    }



Цитата(ivg @  22.1.2009,  11:55 Найти цитируемый пост)
Полный стек-трэйс? 


полный stacktrace не нужен, он говорит лишь о том, что exception был кинут из-за -> см. вверху..



Цитата(ivg @  22.1.2009,  11:55 Найти цитируемый пост)
Есть запрос на удаление из связанной таблицы?


ошибка:

Код

org.postgresql.util.PSQLException: ERROR: update or delete on table "aixmatsroute" violates foreign key constraint "fk9d5e2f2eec7c634b" on table "aixmatsroute_fixidentifiers"
  Detail: Key (pk)=(1629) is still referenced from table "aixmatsroute_fixidentifiers".



Цитата(ivg @  22.1.2009,  11:55 Найти цитируемый пост)
Ну и всё таки, зачем вам Spring здесь нужен? 


см выше.. для тестов smile т.к. нужны precondition и postcondition, что не входят в логику приложения.. всё надо подгоровить smile

Spring я взял из за простоты конфигурации и настройки тестирующего прилoжения.. это всё  smile




Автор: ivg 23.1.2009, 01:24
Похоже в HQL удаление таким образом связанных сущностей не проходит. Похоже на баг. Однако всё нормально удаляется если использовать org.hibernate.Session#delete() и иже с ним. Кстати в org.springframework.orm.hibernate3.HibernateTemplate все аналогичные операции присутствуют и, наверно, нет смысла обёртывать это в HibernateCallback? Так удаление происходит несколькими командами, в которых сначала удаляются записи из связанных таблиц. Что же касается установки в базе FK constraint on delete cascade, то, по видимому, это делается только с помощью аннотации @OnDelete(action=OnDeleteAction.CASCADE), но к сожалению, не проходит валидация при экспорте схемы. Хотя с помощью hbm2ddl проходит, и нормально ключ создаётся.
PS: Hibernate-Version: 3.2.4.sp1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)