【问题标题】:Sequence used to increment and ID in Postgresql not called by hibernate用于在 Postgresql 中递增和 ID 的序列未被休眠调用
【发布时间】:2016-03-22 15:00:30
【问题描述】:

我在 Postgresql 中的现有表中添加了一个序列 MAIL_ID_SEQ

CREATE SEQUENCE MAIL_ID_SEQ START WITH 1;
alter table MAIL alter column ID set default nextval('MAIL_ID_SEQ'::regclass);
alter SEQUENCE MAIL_ID_SEQ owned by MAIL.ID;

ID 存在于复合键 MailId 中:

@Embeddable
public class MailId implements Serializable{
  @Column(name = "ID")
  private int id;

  @Column(name = "YEAR")
  private int year;
}

我希望 ID 是 auto_increment 使用我创建的序列。 问题是通过Hibernate插入新记录时ID的值始终为0,但是当我直接从MAIL表中的命令行(inset into MAIL ..)插入值时, ID 的值递增。

【问题讨论】:

  • 对不起,我删除了我的答案,似乎我误解了你遇到的问题。

标签: java hibernate postgresql


【解决方案1】:

您需要在id 字段中添加这样的注释:

    @SequenceGenerator(name = "mail_id_gen", sequenceName = "MAIL_ID_SEQ", allocationSize = 1)
    @GeneratedValue(generator = "mail_id_gen")

每个类的生成器名称必须不同。 allocationSize 是完全可选的,但将其设置为 1 是解决 Hibernate 5.0 和 5.1 中与模式导出未创建的序列相关的错误的解决方法。该错误的另一个解决方法是在persistence.xml 中将hibernate.id.optimizer.pooled.preferred 属性设置为NONE,如下所示:

<property name="hibernate.id.optimizer.pooled.preferred" value="NONE"/>

如果这还不够,它仍然尝试插入 0,请将字段类型从 int 更改为 Integer,并将其默认设置为 null

【讨论】:

  • 谢谢你的回答,我用的是hibernate 4.3。对我有用的唯一转变是将 SqlQuery 添加为:getSession().createSQLQuery("select nextval('courrier_id_seq')"); 并手动将结果设置为 id。
  • 我们的项目也是使用4.3。对我们进行了一些优化的修改版本。与它无关,我们所有的实体都有@SequenceGenerator@GeneratedValue 注释可以正常工作。单独使用默认参数的 @GeneratedValue 也可能有效,但这是我们继承的风格。使用不完全小写的表或序列有时会导致 Hibernate + Postgre 出现错误。
猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 2011-07-16
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2017-08-13
相关资源
最近更新 更多