2013-03-17 49 views
4

对不起,如果这个问题已经被问到,我读过一些文章,但没有找到答案。如何使字符串主键休眠。 @GeneratedValue策略

我的目标是创建具有唯一字段IMEI的实体设备,并且我想将其用作主键,并在设备注册时指定它(手动指定,同时创建实体)。 我使用Spring roo工具进行开发,并使用hibernate作为ORM。

当我在实体声明中指定这样的:

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(identifierField = "IMEI", identifierType = String.class) 
public class Device {...} 

我得到这个生成。

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "IMEI") 
private String Device.IMEI; 

虽然与MySQL数据库部署项目的服务器我得到这个错误

2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table device (imei varchar(255) not null auto_increment, model varchar(255), name varchar(255) not null, version integer, primary key (imei)) 
2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect column specifier for column 'imei' 

然后我重写袋鼠产生的场

@Id 
@GeneratedValue(generator = "org.hibernate.id.Assigned") 
@Column(name = "the_code") 
private String code; 

(我发现这hear

但仍然出错,然后我已将代码简单地更改为此

@Id 
private String IMEI; 

然后它工作正常,并要求我在保存实体之前指定imei字段。

我的问题是:

是否使用我的自定义字段作为id是正确的。

是它确定要由字符串

是它确定它不与休眠产生,但是从设备IMEI服用。

什么org.hibernate.id.Assigned

为什么袋鼠的@RooJpaActiveRecord(identifierField = “IMEI”,identifierType = String.class)不起作用生成的代码。

是更多钞票来创建字符串自动生成primery关键

什么是默认GeneratedValue战略价值(我最后的情况下)

我读过official doc,但没有理解所有,请参考我第我岑读了这一切。

谢谢,对不起长时间的问题。

回答

11

@GeneratedValue(strategy = GenerationType.AUTO)不能与String类型一起使用。因此,如果您想使用String作为ID,则必须手动分配它。但如果它适合您的需要,可以使用String作为ID。

使用org.hibernate.id.Assigned也意味着您必须在保存数据之前分配ID值。

@GeneratedValue未添加注释时,默认为分配生成器,这意味着标识符的值必须由应用程序设置。

详情请参阅the hibernate manual

11

一个简单的解决方案可能是在您的实体类上使用@PrePersist注释。

只需添加方法

@PrePersist 
private void ensureId(){ 
    this.setId(UUID.randomUUID().toString()); 
} 

,并摆脱@GeneratedValue注释。

PrePersist文档:http://docs.oracle.com/javaee/5/api/javax/persistence/PrePersist.html

斯特凡诺

+0

谢谢,它的工作原理就像一个魅力! – 2013-12-30 19:25:47

+0

但是如果生成的ID已经存在于表中呢?虽然,这个ID是安全生成的,但至少有一个机会可以让这个ID出现在表格中? – user12458 2014-07-10 17:58:17

+0

正如文档所述,UUID是一个“不可变的通用唯一标识符”。 – 2014-07-23 07:42:40