如果Table没有auto_increment,异常«org.hibernate.HibernateException:数据库返回没有本机生成的标识值»如果我尝试在Table中插入一些内容将被抛出。 Id的映射如下:
@Id @GeneratedValue
private int id;
我虽然有hbm2ddl.auto = update。不幸的是,它没有通过验证在目标表上设置AUTO_INCREMENT。我可以实现它,没有HQL,没有原生SQL会更好吗?
答案 0 :(得分:2)
hbm2ddl设置与身份GenerationType无关。
您可以编写自己的ID /密钥生成器类,让hibernate知道您自己的密钥生成器类。然后,hibernate将从您自己的生成器获得身份。
您可能想看一些文章:
http://blog.anorakgirl.co.uk/?p=43
http://www.devx.com/Java/Article/30396/0/page/3
生成ID的逻辑,取决于您的要求。最简单的方法是max(id)+1,你可以缓存性能的max(id)。好吧,如果在群集环境中运行应用程序,则必须注意线程安全问题以及缓存同步问题。
不过,你在玩哪个数据库?<强>更新强>
打开http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id,然后搜索“5.1.2.2.1。各种其他生成器”,如果您的应用程序未在群集中运行,请查看生成类型“增量”。
答案 1 :(得分:2)
在PostgreSQL中,我找到了通过hbm2ddl.auto=create
1
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
PostgreSQL生成PK为id serial not null
,即每个表的唯一序列
2
@Id
@Column(name = "id", unique = true, nullable = false, columnDefinition = "integer default nextval('hibernate_sequence')")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
protected Integer id;
在这种情况下,FK发生了一些奇怪的事情:
create table meals (
id integer default nextval('hibernate_sequence') not null,
calories int4 not null,
date_time timestamp not null,
description varchar(255) not null,
user_id integer default nextval('hibernate_sequence') not null,
primary key (id)
)
在h2自动生成和自动增量工作正常。