Сущность не сохраняется при использовании jpa

Я использую следующие аннотации полей:

@Id
@TableGenerator( name = "comment_sequence", pkColumnValue = "comment_sequence" )
@GeneratedValue( strategy = GenerationType.TABLE, generator = "comment_sequence" )
private Long id_comment;

SQL для создания таблицы:

CREATE TABLE hibernate_sequences ( sequence_name VARCHAR(255) NOT NULL, next_val bigint, PRIMARY KEY ( sequence_name ) );
INSERT INTO hibernate_sequences VALUES ( 'comment_sequence', 1 );

Но сущность просто не сохраняется. Любая идея о том, что может происходить? Я делаю что-то не так с кодом, представленным выше?


РЕДАКТИРОВАТЬ:

Я скрыл немного информации в исходном посте, извините (спрашивал посреди ночи почти во сне =/).

Объект создается правильно, если я изменю стратегию на SEQUENCE и добавлю SQL CREATE SEQUENCE hibernate_sequence, все будет работать нормально (он сохраняется), но я хочу использовать стратегию TABLE для хранения каждой последовательности таблиц в строке на hibernate_sequences.

Единственное исключение, которое у меня есть, это TransactionRolledbackException из-за NullPointerException, вызванного неудачным тестом в тесте интеграции. Ничего явного, почему он не вставляет данные.

Я получаю следующий вывод гибернации при использовании hibernate.show_sql = true:

...

12:38:48,753 INFO  [stdout] (pool-5-thread-1) Hibernate: 
12:38:48,754 INFO  [stdout] (pool-5-thread-1)     insert 
12:38:48,755 INFO  [stdout] (pool-5-thread-1)     into
12:38:48,756 INFO  [stdout] (pool-5-thread-1)         cm_comment
12:38:48,757 INFO  [stdout] (pool-5-thread-1)         (cd_status, ds_message, dt_alt, dt_inc, id_user_alt, id_user_inc, id_problem, id_comment) 
12:38:48,758 INFO  [stdout] (pool-5-thread-1)     values
12:38:48,759 INFO  [stdout] (pool-5-thread-1)         (?, ?, ?, ?, ?, ?, ?, ?)

12:38:48,766 INFO  [stdout] (pool-5-thread-1) Hibernate: 
12:38:48,766 INFO  [stdout] (pool-5-thread-1)     select
12:38:48,767 INFO  [stdout] (pool-5-thread-1)         commentent0_.id_comment as id1_6_,
12:38:48,768 INFO  [stdout] (pool-5-thread-1)         commentent0_.cd_status as cd2_6_,
12:38:48,770 INFO  [stdout] (pool-5-thread-1)         commentent0_.ds_message as ds3_6_,
12:38:48,771 INFO  [stdout] (pool-5-thread-1)         commentent0_.dt_alt as dt4_6_,
12:38:48,772 INFO  [stdout] (pool-5-thread-1)         commentent0_.dt_inc as dt5_6_,
12:38:48,773 INFO  [stdout] (pool-5-thread-1)         commentent0_.id_user_alt as id6_6_,
12:38:48,774 INFO  [stdout] (pool-5-thread-1)         commentent0_.id_user_inc as id7_6_,
12:38:48,775 INFO  [stdout] (pool-5-thread-1)         commentent0_.id_problem as id8_6_ 
12:38:48,776 INFO  [stdout] (pool-5-thread-1)     from
12:38:48,777 INFO  [stdout] (pool-5-thread-1)         cm_comment commentent0_ 
12:38:48,778 INFO  [stdout] (pool-5-thread-1)     where
12:38:48,779 INFO  [stdout] (pool-5-thread-1)         commentent0_.id_problem=?

12:38:48,840 ERROR [org.jboss.arquillian.protocol.jmx.JMXTestRunner] (pool-5-thread-1) 
...

 java.lang.AssertionError: expected:<1> but was:<0>  

...

Я не уверен, может ли это быть связано, но в предыдущем тесте я получаю сообщение об ошибке:

12:50:36,510 INFO [org.jboss.as.ejb3] (pool-4-thread-1) JBAS014101: Failed to find SFSB instance with session ID {[-98, -17, -32, -33, 63, 107, 74, 59, -76, -127, -19, 29, 24, 45, -50, 5]} in cache

Когда я меняю postgresql.conf на log_statement = 'all' и проверяю каталог pg_log после запуска приложения, я не вижу никаких журналов. Поэтому я не уверен, как я могу включить эту опцию.

Я также использую Arquillian, API arquillian persistence и управляемый экземпляр JBoss для интеграционного тестирования. Я собираюсь обновить теги, потому что это может быть связано с любым из них.


person Fagner Brack    schedule 03.03.2013    source источник
comment
Да, вы делаете что-то не так, исходя из того, что это не работает. Если вы хотите большего, вам нужно будет показать гораздо больше вашего кода и конфигурации, а также любые ошибки, которые вы можете получить. Желательно предоставить SSCCE.   -  person Ryan Stewart    schedule 03.03.2013
comment
Вы создали сущность? Вы настаивали на этом? Мы ничего этого не видим. Вам также следует включить log_statement в PostgreSQL, а затем просмотреть файл журнала PostgreSQL на наличие утверждений и ошибок, которые могут иметь значение. Убедитесь, что ваш код также не проглатывает исключения.   -  person Craig Ringer    schedule 03.03.2013
comment
@RyanStewart Я думал, что это неявно. Я делаю что-то не так с кодом, представленным выше? @CraigRinger Я отредактирую свой пост, объясняя немного больше, я просто подумал, что в этой части кода может быть что-то не так, потому что, если я изменю стратегию на SEQUENCE, все будет работать нормально.   -  person Fagner Brack    schedule 03.03.2013
comment
Вы все еще не показываете никакого кода. Тест, вероятно, не пройден, потому что искомая id_problem не является той id_problem, которая была вставлена ​​только что. И вы не видите никаких исключений, вероятно, потому, что они перехвачены и проигнорированы.   -  person JB Nizet    schedule 03.03.2013


Ответы (1)


В вашей «декларации» TableGenerator не содержится никакой информации о том, в какой таблице он должен искать/использовать, все, что вы ей даете, это имя pkColumn....

Пытаться:

@TableGenerator( name = "comment_sequence", table = "hibernate_sequences", pkColumnName = "sequence_name", valueColumnName = "next_val", pkColumnValue = "comment_sequence", allocationSize=1)

allocationSize=1, вероятно, должно быть больше 1 ... когда вы убедились, что он работает. (В дальнейшем помните о потенциальных проблемах с блокировкой, если вы используете эту стратегию и помещаете много генераторов в одну и ту же таблицу в БД - если ваше приложение создает «множество» сущностей.)

person esej    schedule 03.03.2013
comment
Когда я меняю allocationSize на 1, он работает. Дело в том, что я удаляю таблицы последовательностей в каждом тесте, тогда я предполагал, что следующая последовательность, которую нужно искать в тесте, равна 1. Возможно, значение 50 каким-то образом хранится в памяти? Я пытаюсь понять, почему это происходит. А что касается последовательностей, вы рекомендуете использовать одну таблицу для каждой сущности, чтобы избежать блокировки? - person Fagner Brack; 04.03.2013
comment
Я не могу сказать, почему и как - это, вероятно, связано с тем, как вы настраиваете arquillian и пишете этот конкретный тест. ИМХО, вам все равно, так как вы удаляете/воссоздаете таблицу последовательностей в каждом тесте, вы на самом деле не тестируете ничего реального в отношении последовательности, генерирующей идентификатор части объекта. ... . Нет, по моему опыту, с генераторами таблиц все в порядке (только когда-либо видел проблемы с блокировкой с ошибочными конфигурациями). Хорошо знать об этом, но записи (блокировки) должны быть очень короткими, если они находятся в своей собственной db-транзакции (я думаю, как настроить это зависит от реализации JPA). - person esej; 04.03.2013
comment
Если вы отредактируете свой ответ, указав, что allocationSize = 1 является решением, я приму его. - person Fagner Brack; 04.03.2013