我看到以下选项:
1)你可以使用@生成 https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#mapping-generated-Generated注解。
您应该有一个按以下方式声明的表:
create sequence TST_DATA_SEQ increment by 1 start with 1;
create table TST_DATA (
...
dat_auto integer default nextval('TST_DATA_SEQ'),
...
);
以及实体中的适当列:
@Generated(value = GenerationTime.INSERT)
@Column(name = "dat_auto", insertable = false, updatable = false)
private Long auto;
请注意,根据文档 https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#mapping-generated:
标记为生成的属性还必须是不可插入和不可更新的。
因此,hibernate 将进行额外的查询来填充auto
冲洗后的田地。
Data data = new Data();
// filling fields except data.auto
session.persist(data);
session.flush();
insert into TST_DATA (dat_name, dat_id)
values (?, ?)
Hibernate: /* get generated state com.example.hibernate.Data */
select data_.dat_auto as dat_auto_0_
from TST_DATA data_
where data_.dat_id=?
2)你可以使用@GeneratorType https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#mapping-generated-GeneratorType注解。
你应该有一个 hibernate 的实现ValueGenerator
。您可以在下面看到简单的示例。
import java.math.BigInteger;
import org.hibernate.Session;
import org.hibernate.tuple.ValueGenerator;
public class MyGenerator implements ValueGenerator<Long>
{
public Long generateValue(Session session, Object owner)
{
return (
(BigInteger) session
.createNativeQuery("select nextval('TST_DATA_SEQ')")
.getSingleResult()
).longValue();
}
}
然后你可以像这样使用它:
@GeneratorType(type = MyGenerator.class, when = GenerationTime.INSERT)
@Column(name = "dat_auto")
private Long auto;
在这种情况下,您不应按照 n1 中的要求为列声明提供默认值。并且适当的实体字段不应该有@Column(... insertable = false, updatable = false)
。每次持久化该实体时,hibernate 都会生成查询:
select nextval('TST_DATA_SEQ')
并将该值填充到auto
field.