休眠:hbm2ddl.auto=更新和自动增量

发布于 2024-12-10 14:28:15 字数 278 浏览 0 评论 0原文

如果表没有 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

飞烟轻若梦 2024-12-17 14:28:15

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.

烂柯人 2024-12-17 14:28:15

在 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 中,自动生成和自动增量工作正常。

In PostgreSQL I've found 2 way to make autoincrement by hbm2ddl.auto=create

1.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;

PostgreSQL generate PK as id serial not null ie unique sequence for every table

2.

@Id
@Column(name = "id", unique = true, nullable = false, columnDefinition = "integer default nextval('hibernate_sequence')")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
protected Integer id;

In this case something strange happened with 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)
)

In h2 autogenerate and autoincrement works OK.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文