我尝试配置映射类以使用我在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;
}
}
答案 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)
答案 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;
希望这有帮助