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

时间:2013-03-17 21:36:35

标签: hibernate spring-mvc generator spring-roo

我的目标是创建一个具有唯一字段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 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'

然后我用

覆盖roo生成的字段
@Id
@GeneratedValue(generator = "org.hibernate.id.Assigned")
@Column(name = "the_code")
private String code;

(我在here

中找到了这个

但仍然会出错。然后我简单地将代码更改为:

 @Id
private String IMEI;

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

我的问题是:

将我的自定义字段用作ID?

可以通过String吗?

可以用hibernate生成它但是从设备imei中获取吗?

什么是org.hibernate.id.Assigned?

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

是否可以创建String自动生成的主键?

什么是默认的GeneratedValue策略值(我的最后一种情况)?

我已阅读official doc,但并不了解所有内容,请参阅我可以阅读所有内容的文章。

谢谢,对不起,很长的问题。

3 个答案:

答案 0 :(得分:16)

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

只需添加方法

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

并删除@GeneratedValue注释。

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

斯特凡诺

答案 1 :(得分:11)

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

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

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

有关详细信息,请参阅the hibernate manual

答案 2 :(得分:2)

目前,可能没有必要。但我认为我们应该为某人更新这张票。

我很想回答堆栈溢出问题,所以希望这很有意义

如果要在hibernate中自动生成String作为ID,可以使用IdentifierGenerator和@GenericGenerator定义规则。

实体声明:

public class Device {...

    @Id
    @GenericGenerator(name = "sequence_imei_id", strategy = "com.supportmycode.model.ImeiIdGenerator")
    @GeneratedValue(generator = "sequence_imei_id")
    @Column(name = "IMEI")
    private String IMEI;

...}

Imei Generator宣言:

public class ImeiIdGenerator implements IdentifierGenerator {...
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {

            // define your IMEI, example IMEI1, IMEI2,...;
            return "IMEI"+ UUID.randomUUID().toString();
...}

保存设备对象时,ImeiIdGenerator会自动生成IMEI(id)。