休眠序列生成器始终为 0

Hibernate sequence generator always 0

我正在尝试配置映射 class 以使用我在 postgres 数据库中定义的序列。当我尝试保留任何实体时,id 始终为零,如果我使用 select nextval('item_seq'),我将得到 1(或下一个 val)。我使用 intellij 重新生成 classes。这个项目中的 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 或抛出异常 'ids for this class must be manually assigned before calling 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;
    }
}

你用的是什么数据库? 可能是不支持序列的数据库??

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

由于 'select nextval(...)' 有效,您的数据库 (postgresql) 支持序列。所以不是这样

也许出于某种原因,hibernate 正在威胁你 int == 0 作为一个 id,它正在尝试更新它而不是插入一个新记录(int =0 的默认值)只是将你的 id 类型更改为 Integer 看看能不能解决问题

尝试为给定的 table 和实体 class 中的序列提供数据库架构名称。 确保您的应用程序用户具有序列的权限(授权)。

-- 更新--

我认为解决方案是here

这对我总是有效(尽管是 Hibernate 4.x):

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

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

我遇到了同样的问题,以下是我为解决该问题所做的工作

我正在使用 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;

希望对您有所帮助