2010-10-19 2 views
0

У меня есть целая куча Java-бобов аннотированных как это с JPA:Аннотации Hibernate - идентификатор не правильно установлен

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class TitleEntry extends Entry { 
    private Long id; 

    public TitleEntry() { } 

    public TitleEntry(String code, String label) { 
     super(code, label); 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    protected void setId(Long id) { 
     this.id = id; 
    } 
} 

Идентификатор всегда генерируется, как это для каждого объекта и, кажется, работает хорошо.

Теперь проблема: Когда я сохранить объект в Java:

dao.save(titleEntry); 

ид-свойство компонента устанавливается в Инт-значение, что делает не соответствуют фактическим идентификатором. Это соответствует hibernate_sequence (я думаю).

Вопросы:

  1. Почему?
  2. Что такое hibernate_sequence в любом случае (не можете найти достойное объяснение на веб-сайте Hibernate)?
  3. Как это исправить?

Примечания: Я использую Java 1.6, MSSQL2005, Hibernate3

+0

Что такое «фактический идентификатор». ? – Bozho

ответ

1

Попробуйте указать SequenceGenerator с помощью соответствующей аннотации:

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE) 
@SequenceGenerator(name = "myGen", sequenceName = "MY_SEQUENCE") 
public Long getId() 
{ 
    return id; 
} 
1

Почему?

Я не знаю, предыдущий абзац о каком-то «фактический идентификатор» не имеет никакого смысла. Вы можете уточнить? Отображение структуры таблицы TitleEntry также может помочь.

Что такое hibernate_sequence в любом случае (не можете найти достойное объяснение на веб-сайте Hibernate)?

По умолчанию имя последовательности или таблицы, используемой Hibernate (см. 5.1.5. Enhanced identifier generators). Учитывая, что SQL Server не поддерживает последовательность, я бы сделал ставку на более позднюю. Вы должны проверить созданный DDL, чтобы найти то, что было сделано точно (и показать соответствующую часть).

Но я удивлен, что Hibernate не по умолчанию не IDENTITY (какая версия Hibernate вы используете точно?).

Как это исправить?

Я не знаю, что вы хотите исправить, но если вы хотите полный контроль, не используйте AUTO стратегию (IDENTITY обычно с SQL Server).

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