1

我想映射我的域对象以使用新的Oracle 12c身份类型主键,AKA在其他一些系统中自动递增。为身份PK配置适用于Oracle 12c的Grails 3.0.9?

Hibernate 4没有Oracle12cDialect,它只有Oracle10gDialect。

Oracle10gDialect有一个名为supportsIdentityColumns()的方法,它被硬编码为返回false,因此使用generator生成“Gage”域对象:“identity”会导致错误,指出Oracle10gDialect不支持标识生成器。

我不能使用GORM选择生成器,因为我没有辅助唯一键,而且我不能使用Hibernate生成的键,因为随后Hibernate和其他(外部)插入到表中会生成重叠键。

现有Oracle 12C DDL的实施例:

create table person (
      id number(10,0) generated by default as identity, 
      version number(10,0) not null, 
      home_address_id number(10,0), 
      name varchar(255) not null, 
      primary key (id) 
    ); 

GORM对象:

class Person { 

    String name 
    Address homeAddress 

    static mapping = { 
     id column: 'person_key', generator: 'identity' 
    } 

    static constraints = { 
     homeAddress nullable: true 
    } 
} 

在存储器DB结果(运行完美):

Hibernate: create table person (person_key bigint generated by default as identity, version bigint not null, home_address_id bigint, name varchar(255) not null, primary key (person_key)) 
Hibernate: alter table person add constraint FK_bemy93e8a8i6nknj4n21m6fub foreign key (home_address_id) references address 
Hibernate: insert into person (person_key, version, home_address_id, name) values (null, ?, ?, ?) 

Oracle数据库查询结果(碎):

org.hibernate.MappingException: org.hibernate.dialect.Oracle10gDialect does not support identity key generation 

如何获得的Grails 3.0.9与上面的Oracle表定义的工作?

回答

1

Hibernate 4不能配置为使用Oracle 12c标识生成密钥。

创建自定义Oracle12cDialect不允许我们使用身份密钥生成。它在Hibernate 4中需要额外的支持,而不是在那里。

是什么工作与Oracle10gDialect坚持使用发电机:“序列身份”,然后命名是这样的顺序:

static mapping = { 
    id column: 'person_key', generator: 'sequence-identity', params:[sequence:'person_seq'] 
} 

这几乎实现了比与身份创建表等相同的结果关键词在DDL中。即使我们已经能够在表格定义中获得身份关键字,Oracle也会在每次插入记录时在后台创建自己的序列。使用序列标识而不是序列,也可避免双DB调用插入新行。随着身份的序列插入DML是这样一个电话:

insert into person (person_key, version, home_address_id, name) values (person_seq.nextval, ?, ?, ?) 

随着发电机:“序”的新纪录插入变成两个数据库调用是这样的:

select person_seq.nextval from dual; 
insert into person (person_key, version, home_address_id, name) values (?, ?, ?, ?) 

所以,唯一的缺点是我在'identity'上查看'identity-sequence'只是简单地说Oracle不会自动跟踪哪个表使用哪个序列并在插入语句中没有提供键值时自动使用它。但即使如此,也可能会在插入触发器之前处理,此时,如果Hibernate 4支持生成器:身份,那么您几乎可以确切地将它放在哪里。

0

休眠5 确实有一个Oracle 12c Dialect,特别添加了“身份”支持:org.hibernate.dialect.Oracle12cDialect。所以要么使用Hibernate 5,要么编写一个定制的基于12c的Hibernate 4 Dialect。

+0

我知道,我很喜欢使用Hibernate 5,但是我不认为Grails支持Hibernate 5,但它不是吗?我能找到的插件的最新版本是这样的:org.grails.plugins:hibernate:4.3.10.5。 – DAC

+0

我们正在尝试编写我们自己的自定义方言。我会很快回复这个结果。 – DAC

+0

实现了我们自己的Oracle 12c方言,它不起作用。当我们获得自定义方言并运行后,很明显Grails Hibernate插件的其他部分还需要做其他更改。 – DAC

相关问题