Hibernate Annotations - 未正确设置id

时间:2010-10-19 12:26:38

标签: java sql-server-2005 hibernate jpa

我有一大堆使用JPA注释的Java bean:

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;
    }
}

对于每个对象,id总是这样生成,并且似乎工作正常。

现在问题: 当我用Java保存对象时:

dao.save(titleEntry);

bean的id-property设置为int-value, not 与实际id相对应。 它对应于hibernate_sequence(我认为)。

问题:

  1. 为什么?
  2. 无论如何是什么是hibernate_sequence(在Hibernate网站上找不到合适的解释)?
  3. 我该如何解决?
  4. 注意:我使用的是Java 1.6,MSSQL2005,Hibernate3

2 个答案:

答案 0 :(得分:1)

尝试使用相应的注释指定SequenceGenerator:

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

答案 1 :(得分:1)

  

为什么?

我不知道,关于某些“实际身份证”的前一段没有任何意义。你能澄清一下吗?显示TitleEntry表的结构也可能会有所帮助。

  

究竟是什么hibernate_sequence(在Hibernate网站上找不到合适的解释)?

Hibernate使用的序列或表的默认名称(请参阅5.1.5. Enhanced identifier generators)。鉴于SQL Server不支持序列,我打赌后者。您应该检查生成的DDL以查找已完成的操作(并显示相关部分)。

但是我很惊讶Hibernate没有默认为IDENTITY(你正在使用什么版本的Hibernate?)。

  

我该如何解决?

我不知道您想要修复什么,但如果您想要完全控制,请不要使用AUTO策略(SQL Server通常使用IDENTITY)。