2013-03-03 4 views
1

Я использую следующие поля аннотаций:Entity не сохраняется при использовании 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);

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


EDIT:

Я подавил несколько информации в исходное сообщение, я извиняюсь (спросил в середине ночи почти спит = /).

Объект будет должным образом создан, если я изменить стратегию 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 после запуска приложения. Я не вижу никаких журналов. Поэтому я не уверен, как я могу включить этот вариант.

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

+5

Да, вы делаете что-то неправильно, основываясь на том, что он не работает. Если вы хотите больше, вам нужно будет показать намного больше своего кода и конфигурации, а также любые ошибки, которые вы могли бы получить. Предпочтительно предоставлять [SSCCE] (http://sscce.org/). –

+0

Вы создали объект? Вы упорствовали? Мы этого не видим. Вы также должны включить 'log_statement' в PostgreSQL, а затем просмотреть файл журнала PostgreSQL для операторов и ошибок, которые могут быть релевантными.Убедитесь, что код также не проглатывает исключения. –

+0

@ RyanStewart Я думал, что это подразумевалось: «Я делаю что-то неправильно с приведенным выше кодом?». @CraigRinger Я отредактирую свой пост, объяснив немного дальше, я просто подумал, что часть кода может иметь что-то неправильное, потому что, если я изменю стратегию на 'SEQUENCE', все будет хорошо. –

ответ

2

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

Try:

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

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

+0

Когда я изменяю 'allocSize' до 1, он работает. Дело в том, что я удаляю таблицы последовательностей для каждого теста, тогда я предполагал, что следующая последовательность поиска в тесте равна 1. Возможно, значение 50 каким-то образом удерживается в памяти? Я пытаюсь понять, почему это происходит. И о последовательностях, рекомендуете ли вы использовать одну таблицу для каждого объекта, чтобы избежать блокировки? –

+0

Я не могу сказать, почему/как - возможно, это связано с тем, как вы «настраиваете» arquillian и записываете этот конкретный тест. ИМХО, вам все равно, так как вы удаляете/воссоздаете таблицу последовательностей каждый тест, вы на самом деле не проверяете что-либо реальное относительно части, генерирующей идентификатор части. .... Нет, в моем epxerience настольные генераторы прекрасны (только когда-либо видели проблемы с блокировкой с неисправными конфигурациями). Хорошо знать, но запись (блокировка) должна быть крайне короткой, если они находятся в их собственной транзакции db (я думаю, как настроить, что зависит от реализации JPA.) – esej

+0

Если вы отредактируете свой ответ, указав что 'allocSize = 1' является решением, тогда я его принимаю. –

Смежные вопросы