Hibernate序列生成器始终为0

时间:2015-03-16 12:42:33

标签: java hibernate postgresql annotations sequence

我尝试配置映射类以使用我在postgres db中定义的序列。当我尝试保留任何实体时,id总是为零,如果我使用select nextval(' item_seq'),我将获得1(或下一个val)。我使用intellij重新生成类。这个项目中的hibernate版本是3.6.0,如果这可能是我的问题的一部分?

@Entity
@Table(name = "item")
public class Item {
    private int itemid;
    ...

    @Basic
    @Id
    @SequenceGenerator(name = "item_seq", sequenceName = "item_seq", allocationSize = 1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "item_seq")
    @Column(name = "itemid", unique = true, nullable = false, insertable = true, updatable = true)

    public int getItemid() {
        return itemid;
    }
    ...
}

用法

Item item = new Item();
item.setCreated(new Date());
item.setVendorId(vendorId);
save(item); // essentially is getHibernateTemplate().save(Item.class.getName(), item);

- 编辑 -

我一直在尝试下面的建议,所有内容似乎都会继续生成0作为ID或抛出异常'此类的ID必须在调用save()'之前手动分配。这就是我现在所处的位置,作为最后的努力,我尝试将注释移动到变量声明而不是getter。没有帮助。

@Entity
@Table(name = "item")
public class Item {
    @Id
    //@SequenceGenerator(name = "item_seq", sequenceName = "item_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.IDENTITY) //, generator = "item_seq")
    @Column(name = "itemid", unique = true, nullable = false) //, insertable = true, updatable = true)
    private Long itemid;
...

    public Long getItemid() {
        return itemid;
    }
}

4 个答案:

答案 0 :(得分:1)

这总是对我有用(Hibernate 4.x虽然):

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Id使列成为主键(唯一,无空),因此您不需要@Column(...)注释。在某处设置itemId的东西是什么?你可以删除它的setter(Hibernate不需要)。

答案 1 :(得分:0)

你正在使用什么数据库? 可能是一个不支持序列的数据库??

尝试使用strategy = auto并查看它是如何工作的

因为'select nextval(...)'工作,你的数据库(postgresql)支持序列。所以不是吗

也许出于某种原因,hibernate威胁你int == 0作为id并且它试图更新它而不是插入新记录(int = 0的deafult值)只是将你的id类型改为{{1}并查看它是否解决了问题

答案 2 :(得分:0)

尝试为实体类中的给定表和序列提供数据库模式名称。 确保您的应用程序用户具有序列的权限(授予)。

- 更新 -

我认为解决方案是here

答案 3 :(得分:0)

我遇到了同样的问题,这就是我解决问题的方法

我使用Hibernate工具自动生成POJO,并且所有注释都放在方法级别,但是,Spring在字段级别建议(需要?)它们。您也不能将Id注释移动到字段级别,因为它是一个或另一个(当我尝试这个时我得到了一些其他例外)。所以我按照this的答案定制了Hibernate工具,以便在字段级别生成带有注释的POJO。

现在我的代码看起来像这样,并且它正好使用数据库序列序列。

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="my_seq")
@SequenceGenerator(name="my_seq",sequenceName="SPT_PROJECT_SEQ", allocationSize=1)
@Column(name = "PROJECT_ID", unique = true, nullable = false, precision = 10, scale = 0)
private long projectId;

希望这有帮助