2015-08-28 3 views
0

Мне удалось заставить спящий режим увеличивать id каждой таблицы на 1, помещая это в каждый класс сущности.hibernate ID increment oracle

@Entity 
public class TestObject implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idgen") 
@SequenceGenerator(
     name="idgen", 
     sequenceName="testobject_seq", 
     allocationSize=1, 
     initialValue=1 
    ) 

У меня есть две таблицы, которые я заполняю данными вручную через Oracle SQL Developer. После того, как я создал таблицы.

<property name="hibernate.hbm2ddl.auto">create</property> 

Для двух таблиц с данными в нем я устанавливаю initialValue в то, что мне нужно. Например, тестовая камера таблицы имеет 22 строки с данными. Так что мои аннотации изменение к этому:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idgen") 
@SequenceGenerator(
     name="idgen", 
     sequenceName="testchamber_seq", 
     allocationSize=1, 
     initialValue=23 
    ) 

Но когда я пытаюсь сохранить новый объект testChamber я получаю эту ошибку.

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session 

Я мог бы спасти мою сущность без проблем, прежде чем я изменил аннотацию, но со старым аннотаций спящего режима увеличивается идентификатор случайным образом. Например, спящий режим дал новый объект идентификатор 60, 61 вместо 23, 24 и так далее ..

Это был мой старый аннотаций:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
  • Есть правильный способ, чтобы сказать hibernate, что таблица уже имеет данных в ней, и она должна начинать отсчет определенного числа?
  • или как я могу избавиться от «NonUniqueObjectException».
+0

Вы пытались использовать метод flush() перед сохранением из объекта сеанса? – Lucky

+0

Я попробовал, flush() имеет нет эффекта. Также я думаю, что hibernate использует flush() aut omatically, когда вызывается transaction.commit(). –

+0

Хорошо, попробуйте 'session.merge (object)' для сохранения ваших данных. – Lucky

ответ

1

Это сообщение помогло мне с моей проблемой "link". Но Anser из @nolexa правильно, а не от Алекса Гительмана, который на самом деле проверяется, как правильно. я поставил этот

<property name="hibernate.id.new_generator_mappings">true</property> 

в мой hibernate.cfg.xml и все мои созданные последовательности работают нормально. Большое спасибо @nolexa !!