使用休眠注释自动递增和用户定义的 id

Posted

技术标签:

【中文标题】使用休眠注释自动递增和用户定义的 id【英文标题】:Auto increment and user defined id using hibernate anotation 【发布时间】:2013-03-06 10:13:19 【问题描述】:

我可以使用 hibernate 注释为同一字段设置自动增量和用户设置 id 吗?

例如: 如果用户输入 ID,则使用给定的 ID

-或-

如果用户没有输入任何内容,Hibernate 应该自己创建 ID。

如有任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

由于您已绑定到 Hibernate,因此您可以使用自定义 id 生成器。假设您有以下 id 字段,如果用户提供了您想要的 id,否则它应该是自动生成的。

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="CustomIdGenerator")
@GenericGenerator(name="CustomIdGenerator ",
                  strategy="xx.yy.zz.CustomIdGenerator"
)
private Integer id;

这是自定义生成器,如果没有提供,它将生成 id。

import org.hibernate.id.IdentityGenerator;
...
public class CustomIdGenerator extends IdentityGenerator 


@Override
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException 

    if ((((yourEntity) obj).getId()) == null) 
        Serializable id = super.generate(session, obj) ;
        return id;
     else 
        return ((yourEntity) obj).getId();

    

【讨论】:

谢谢 Piyush,我是否可以使用 GenerationType.IDENTITY,如果 id 为空,那么 GenerationType.IDENTITY 会被调用或类似的东西,因为我不想创建生成器? 这就是生成器正在做的事情!!!无论如何,您需要检查 id 是否为空。自定义生成器正在覆盖 AutoSequenceGenerator 的默认生成行为。 @Piyush,我尝试了这个解决方案,但是当我没有设置 id 时它给了我空值(在这种情况下它应该返回我新的 id)。当我调试时,Serializable id = super.generate(session, obj) 位置我收到POST_INSERT_INDICATOR IdentifierGeneratorHelper$2 的对象@【参考方案2】:

我想你正在寻找这个

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

【讨论】:

Baadshah,感谢重播。其实我在找别的东西。因为,通过使用此配置,如果我尝试使用用户输入的 ID(不是由 Hibernate 生成)保存记录,在这种情况下,休眠不允许我保存它。

以上是关于使用休眠注释自动递增和用户定义的 id的主要内容,如果未能解决你的问题,请参考以下文章

添加具有自动递增的自定义 ID 的子项 - Firebase

MySQL用户定义函数使用日期自动递增值

SQL 用户 ID 自动递增

如何使用 PostgreSQL 在 DBeaver 中创建自动递增/SERIAL id 列?

在oracle 怎样设置自动递增的的字段,也就是设置自动递增的ID 主键

在不修改实体类(注释)或数据上下文(使用 fluentapi)的情况下禁用标识(自动递增)