微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使字符串主键进入休眠状态@GeneratedValue策略

如何解决如何使字符串主键进入休眠状态@GeneratedValue策略

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

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

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

有关详细信息,请参见hibernate手册

解决方法

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

当我在实体声明中指定此代码时:

@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;

(我在这里找到

但是仍然会出错。然后,我仅将代码更改为此:

 @Id
private String IMEI;

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

我的问题是:

将我的自定义字段用作ID是否正确?

用String可以吗?

它不是由hibernate生成的,而是从imei设备中获取的吗?

什么是org.hibernate.id.Assigned?

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

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

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

我已经阅读了官方文档,但并没有全部了解,请参考我可以阅读所有文章的文章。

谢谢,很抱歉长期以来的疑问。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。