如何使字符串主键休眠.@GeneratedValue策略

yar*_*hyn 6 hibernate generator spring-mvc spring-roo

对不起,如果已经问过这个问题,我已经阅读了一些文章,但没有找到答案.

我的目标是创建具有唯一字段IMEI的实体设备,并且我想将其用作质量密钥,并在设备注册时指定它(在创建实体时指定manualy).我使用Spring roo工具进行开发,并将hibernate用作ORM.

当我在实体声明中指定它时:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(identifierField = "IMEI", identifierType = String.class)
public class Device {...}
Run Code Online (Sandbox Code Playgroud)

我得到了这个.

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "IMEI")
private String Device.IMEI;
Run Code Online (Sandbox Code Playgroud)

使用mysql db将项目部署到服务器时出现此错误

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'
Run Code Online (Sandbox Code Playgroud)

然后我用.覆盖roo生成的字段

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

(我听到了这个)

但仍然得到错误,然后我简单地将代码更改为此

 @Id
private String IMEI;
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

将我的自定义字段用作id是否正确.

字符串是否可以

是不是它不是通过休眠生成的,而是从设备imei中获取的.

什么是org.hibernate.id.Assigned

为什么roo为@RooJpaActiveRecord生成代码(identifierField ="IMEI",identifierType = String.class)不起作用.

是否可以创建String自动生成的primery密钥

什么是默认的GeneratedValue策略值(我的最后一个案例)

我已经阅读了官方文档,但没有理解所有内容,请参考我在这里阅读所有这些内容的文章.

谢谢,抱歉很长的问题.

Ste*_*ola 18

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

只需添加方法即可

@PrePersist
private void ensureId(){
    this.setId(UUID.randomUUID().toString());
}
Run Code Online (Sandbox Code Playgroud)

并摆脱@GeneratedValue注释.

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

斯特凡诺


Moo*_*oon 11

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

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

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

有关详细信息,请参阅休眠手册.