批量插入中的 Postgres 错误: 关系“ hibernate_order”不存在位置17

我正在执行 hibernate jpa 批量更新,它给我以下错误

2015-04-21 15:53:51,907 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) SQL Error: 0, SQLState: 42P01
2015-04-21 15:53:51,908 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) ERROR: relation "my_seq_gen" does not exist

我使用 postgres 数据库和我的 ID 是自动生成的

  @Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;

这是我的批处理插入代码片段

getEm().getTransaction().begin();
System.out.println("transaction started--------------");
try {
for (Receipt ReceiptEntity : arrReceiptEntity) {
getEm().persist(ReceiptEntity);
}
getEm().getTransaction().commit();
System.out.println("commited");
} catch (Exception exception) {
System.out.println("error----------------------------------------------------------------------");
if(getEm().getTransaction().isActive())
getEm().getTransaction().rollback();
LOG.error(exception);
} finally {
getEm().flush();
getEm().clear();
getEm().close();
}

我已经将下面的属性添加到尾部

         <property name="hibernate.id.new_generator_mappings" value="true"/>

请指出我做错了什么。

112800 次浏览

你能试试下面的方法吗:

  @Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
@SequenceGenerator(name = "auto_gen", sequenceName = "A")
@Column(name = "ID")
private int id;

谢谢

如果不想更改实体定义,那么需要在 postgreSQL 模式中创建一个名为 hibernate_sequence的序列。

CREATE SEQUENCE hibernate_sequence START 1;

更新 :

您丢失了为您的实体定义的第二个序列 generatef,只需像前一个序列那样添加它:

CREATE SEQUENCE my_seq_gen START 1;

什么是序列?

序列是整数的有序列表。序列中数字的顺序很重要。您可以配置什么是最小值和最大值,您应该增加多少:

CREATE SEQUENCE [ IF NOT EXISTS ] sequence_name
[ AS { SMALLINT | INT | BIGINT } ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ]
[ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ]
[ CACHE cache ]
[ [ NO ] CYCLE ]

不,您可以在 SQL 命令和休眠中使用类似 nextval('')的函数来从集合中获取下一个值。这比将当前主键值保留在 order _ table 中或在现有表中查找 max PK 值要便宜得多。因此,它提供了一个简单而廉价的方法来找到给定表的下一个 PK。

所有的表通常都使用一个专用的 Sequance,就像本例中选择的 IdGenerator 策略一样。

有用的教程:

我希望你得到答案,但如果你仍然找到答案,这可能是有帮助的。

我也遇到了同样的问题,解决了用 @SequenceGenerator@GeneratedValue注释 id 的 getter 方法的问题。

@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN", initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
public int getId(){
return id;
}

尝试用 @Id@GeneratedValue(strategy = GenerationType.IDENTITY)注释你的 id

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

更新: 只有在 id 列声明为 SERIALBIGSERIAL类型时才能工作。

我也遇到了同样的问题,我解决了在表中的 id 列上加上自动增量的问题,就像这样。

ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');


ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id;

在我的例子中,添加属性 name = “ hibernate.hbm2ddl.auto”value = “ 更新”就解决了这个问题

根据一篇文章,hibernate 无法得到下一个序列值 ,设置您的 @ GeneratedId列与策略 一代,类型,身份而不是 世代类型,序列。因此,您将有

@Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;

有时使用 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)注释,您可以使用 空间隔(删除后)和 下一个自增量位置不正确获得您的序列。尝试将 设置下一个自增量值设置为最大 id 值后面的位置:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

将以下内容添加到 application.properties

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update

这将显式设置为在 Spring 启动期间创建或更新所有表。

检查 应用性能文件。

确保 spring.jpa.hibernate.ddl-auto = 更新

最近我遇到了同样的问题,我已经通过使用 @GenericGenerator注释解决了这个问题。这个问题是因为我必须在 liquibase changelog 中插入数百行带有 SQL 语句的行,而且在生成 id 之前,hibernate 不会拾取最后一行及其内容。

@Entity(name = "domain")
@Table(name = "domain", schema = "public")
public class DomainJpa {


@Getter
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "incrementDomain")
@GenericGenerator(name = "incrementDomain", strategy = "increment")
private Integer id;


}

希望这个对某些人有用