休眠:hbm2ddl.auto=更新和自动增量
如果表没有 auto_increment,如果我尝试在表中插入某些内容,则会抛出异常“org.hibernate.HibernateException:数据库返回没有本机生成的标识值”。 Id 映射如下:
@Id @GeneratedValue
private int id;
虽然我有 hbm2ddl.auto=update。不幸的是,通过验证,它没有在目标表上设置 AUTO_INCRMENT。我可以在没有 HQL 且没有原生 SQL 的情况下实现它吗?
If Table has no auto_increment, exception «org.hibernate.HibernateException: The database returned no natively generated identity value» will be thrown if i try insert something in Table. Id is mapped just as:
@Id @GeneratedValue
private int id;
I although have hbm2ddl.auto=update. Unfortunately it does not set AUTO_INCREMENT on destination Table, by validation. Can i achive it, without HQL and better without native SQL?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
hbm2ddl 设置与 Identity GenerationType 无关。
您可以编写自己的 ID/密钥生成器类,并让 hibernate 知道您自己的密钥生成器类。然后 hibernate 将从你自己的生成器中获取身份。
您可能想看一些文章:
http://blog.anorakgirl.co.uk /?p=43
http://www.devx.com/Java/Article/30396/0/page/3
Hibernate ID Generator
用于生成 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.各种附加生成器”并尝试生成类型“增量”。
hbm2ddl setting has nothing to do with Identity GenerationType.
You can write your own ID/key generator class, and let hibernate know your own key-generator class. Then hibernate will get identity from your own generator.
some articles you may want to take a look:
http://blog.anorakgirl.co.uk/?p=43
http://www.devx.com/Java/Article/30396/0/page/3
Hibernate ID Generator
for the logic to generate an ID, it depends on your requirement. The easiest way would be max(id)+1, you could cache the max(id) for performance. well, you have to take care about thread safe issue and also cache synchronization problem if you run the application in a cluster env.
btw, which database are you playing with?
update
open http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id, and search "5.1.2.2.1. Various additional generators" take a look and try the generation type 'increment' if your application is not running in a cluster.
在 PostgreSQL 中,我找到了两种通过
hbm2ddl.auto=create
进行自动增量的方法1.
PostgreSQL 将 PK 生成为
id serial not null
即每个表的唯一序列2.
在这种情况下,FK 发生了一些奇怪的事情:
在 h2 中,自动生成和自动增量工作正常。
In PostgreSQL I've found 2 way to make autoincrement by
hbm2ddl.auto=create
1.
PostgreSQL generate PK as
id serial not null
ie unique sequence for every table2.
In this case something strange happened with FK:
In h2 autogenerate and autoincrement works OK.