Hibernate:hbm2ddl.auto = update und autoincrement

时间:2011-10-17 11:57:03

标签: java hibernate auto-increment

如果Table没有auto_increment,异常«org.hibernate.HibernateException:数据库返回没有本机生成的标识值»如果我尝试在Table中插入一些内容将被抛出。 Id的映射如下:

    @Id @GeneratedValue
    private int id;

我虽然有hbm2ddl.auto = update。不幸的是,它没有通过验证在目标表上设置AUTO_INCREMENT。我可以实现它,没有HQL,没有原生SQL会更好吗?

2 个答案:

答案 0 :(得分:2)

hbm2ddl设置与身份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。各种其​​他生成器”,如果您的应用程序未在群集中运行,请查看生成类型“增量”。

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