Hibernate 自动生成的域类id(包含异常)

Hibernate 自动生成的域类id(包含异常),hibernate,postgresql,grails,id-generation,Hibernate,Postgresql,Grails,Id Generation,情景: 域类是使用默认的Postgres序列生成器创建和插入的(使用自定义方言为每个表创建一个序列,但我认为这与此无关)。现在,在某些情况下,我想选择自己的ID进行插入 我设想两种基本方式: 首选:只需在保存前在域中设置id即可。如果未设置,请使用生成的id。我很天真地尝试了这一点,但没有起作用,即插入实例时使用了自动生成的id,即使域实例中已经设置了另一个id 使用“generator:assigned”映射并确定默认id(由DB决定)。如何做到最好 好的,我终于想到了这个(基本上是由其他人

情景: 域类是使用默认的Postgres序列生成器创建和插入的(使用自定义方言为每个表创建一个序列,但我认为这与此无关)。现在,在某些情况下,我想选择自己的ID进行插入

我设想两种基本方式:


  • 首选:只需在保存前在域中设置id即可。如果未设置,请使用生成的id。我很天真地尝试了这一点,但没有起作用,即插入实例时使用了自动生成的id,即使域实例中已经设置了另一个id
  • 使用“generator:assigned”映射并确定默认id(由DB决定)。如何做到最好

好的,我终于想到了这个(基本上是由其他人在不同时间点提出的不同建议组合而成)

}

要在域类上专门使用它,您需要包括以下内容

static mapping = {
    id generator:'org.hibernate.id.UseExistingOrGenerateTabelNameSequenceIdGenerator', params:[optimizer:'pooled', increment_size:10]
}
到域类定义中,该定义还允许指定id池及其大小。
到目前为止似乎运行得很好:)

好的,所以最后我想到了这个(基本上是由其他人在不同时间点提出的不同建议组合而成)

}

要在域类上专门使用它,您需要包括以下内容

static mapping = {
    id generator:'org.hibernate.id.UseExistingOrGenerateTabelNameSequenceIdGenerator', params:[optimizer:'pooled', increment_size:10]
}
到域类定义中,该定义还允许指定id池及其大小。
到目前为止似乎运行得很好:)

如何确保完整性,以确保您不会使用序列已使用的
id
“如果未设置,请使用生成的id”。PostgreSQL在SQL级别就是这样做的,但这通常不是一个好主意,因为插入一个ID大于当前序列位置的行将在达到该点时导致失败。@dmahapatro在这种情况下,现有行应该是overwritten@Craig振铃器实际要求稍微宽松一点,因为永远不会有一个最初不是由DB生成的id。也就是说,您描述的情况永远不会发生。@user462982一个可行的解决方法是软删除行,因此您可以稍后重新恢复行。如何确保完整性,您不会使用序列已经使用过的
id
?“如果未设置,请使用生成的id”。PostgreSQL在SQL级别就是这样做的,但这通常不是一个好主意,因为插入一个ID大于当前序列位置的行将在达到该点时导致失败。@dmahapatro在这种情况下,现有行应该是overwritten@Craig振铃器实际要求稍微宽松一点,因为永远不会有一个最初不是由DB生成的id。也就是说,您描述的情况永远不会发生。@user462982一个可行的解决方法是软删除行,因此您可以稍后重新恢复它们。