如何让ebean不为ID生成任何值?
Posted
技术标签:
【中文标题】如何让ebean不为ID生成任何值?【英文标题】:How to let ebean not generate any value for the ID? 【发布时间】:2012-04-17 11:09:11 【问题描述】:我正在使用Ebean,并定义了这样一个模型:
@Entity
@Table(name = "users")
public class User extends Model
@Id
public String id;
public String email;
public String name;
你可以看到id
这个字段是String
,并且有一个@Id
注解。
现在我保存它:
User user = new User();
user.id = "abc";
user.email = "a@a.com";
Ebean.save(user);
但是保存的时候发现是id
的值是:1
,不是我指定的abc
。
我检查了sql,发现表生成:
create table users (
id varchar(255) not null,
email varchar(255),
name varchar(255),
constraint pk_users primary key (id))
;
create sequence users_seq;
可以看到有一个seq users_seq
,在插入用户的时候已经使用了。
如何定义模型或者如何配置 Ebean 让它不对@Id 字段做任何事情?就让它使用我指定的值?
============
更新
对不起,伙计们,我发现这种奇怪的行为是因为我的错误!
是的,我将它与 playframework 1 一起使用,并且我尝试为自己创建一个 play-ebean 模块。但是有一点不对:保存模型时,我错误清除了id值!
所以分配的值abc
丢失了,那么Ebean 将尝试使用seq 来为其获取新值。
感谢大家的帮助,再次抱歉,我下次提问时会更加小心。
【问题讨论】:
@DataNucleus,既然Ebean跟着jpa,我觉得可以是“JPA”问题 应该是一般问题,我现在也在玩。 我说这是一个“JPA”问题,因为JPA中可能有一些注释可以改变这种行为,虽然我不知道是否有:) 【参考方案1】:创建另一个唯一字段并选择性地使用它不是更好的主意吗? String userCode
什么的?
Play with Ebean 使用 ID 的自动递增来确保 ID 是唯一的,所以我个人没有更改这一点,因为所有文档都假定模型的 ID 是某种数字类型。
你可以考虑使用 Play 的路由通过 string-id 找到用户,仍然使用 Long id 来执行基本操作。
(我是在 Play 的上下文中写的,因为我假设您在其中询问;))
【讨论】:
【参考方案2】:如果你想对自己的@Id
字段进行操作,你需要扩展GenericModel
而不是Model
。我也在 PlayFramework 上下文中讨论。
【讨论】:
我对你建议的 GenericModel 很好奇,但是 2.0 API 在 play.db.ebean 中没有这样的类,我错过了什么吗? GenericModel 存在于 Play 1.x 中。我不确定 2.0 API以上是关于如何让ebean不为ID生成任何值?的主要内容,如果未能解决你的问题,请参考以下文章