Java Spring Hibernate:模型类主键自动递增字段:在字段上设置自动和手动

Posted

技术标签:

【中文标题】Java Spring Hibernate:模型类主键自动递增字段:在字段上设置自动和手动【英文标题】:Java Spring Hibernate : Model class primary key auto increment field : set automatic and manually on a field 【发布时间】:2015-02-22 08:40:37 【问题描述】:

在 java spring hibernate maven 项目中,我在一个字段上一起使用 (@Id 和 @GeneratedValue(strategy = GenerationType.AUTO)) 来使这个字段 P.K 和 mysql DB 上的自动增量。

我想要:

如果我没有手动设置其 id,则此字段为 auto_increment,如果我通过 setter 手动设置它,它工作正常(但目前如果我手动设置会出错)。

问题:

当我将 id 设为 null 时,auto_increment 有效,但当我手动设置时,我得到错误; 我如何注释和配置我可以通过 setter 和自动 pk Id 手动设置的模型类(我喜欢做的任何人)?

我的代码:

public class Company implements Serializable 
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Basic(optional = false)
@Column(name = "id")
private Integer id; 

基于java doc的注释细节:

@Id : 指定实体的主键

@GeneratedValue(策略 = ... ) : 提供主键值的生成策略规范

GenerationType.IDENTITY: 指示持久性提供程序必须使用数据库标识列为实体分配主键。

GenerationType.SEQUENCE: 指示持久性提供程序必须使用数据库序列为实体分配主键。

GenerationType.TABLE: 指示持久性提供程序必须使用底层数据库表为实体分配主键以确保唯一性。

GenerationType.AUTO: 如果你使用 AUTO,Hibernate 会选择其中一种策略来生成你的 id

【问题讨论】:

【参考方案1】:

您可以为此目的定义自定义 id 生成器,如 here 和 here 指出的那样

它的代码如下所示:-

@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="IdOrGenerated")
@GenericGenerator(name="IdOrGenerated",strategy="....UseIdOrGenerate")
@Column(name = "ID", unique = true, nullable = false, precision = 20, scale = 0)
public Long getId()..

public class UseIdOrGenerate extends IdentityGenerator     
    @Override
    public Serializable generate(SessionImplementor session, Object obj) throws HibernateException 
        if (obj == null) throw new HibernateException(new NullPointerException()) ;

        if ((((EntityWithId) obj).getId()) == null) //id is null it means generate ID
            Serializable id = super.generate(session, obj) ;
            return id;
         else 
            return ((EntityWithId) obj).getId();//id is not null so using assigned id.

        
    

【讨论】:

一个查询:为什么你在 strategy="....UseIdOrGenerate" 中有前 4 个点。它有什么用? 哦,这只是笼统地陈述一个策略。理想情况下,您应该在那里有一个具体策略的名称。 感谢您的澄清。对于像我这样在 SO 中环顾四周学习或理解的菜鸟来说,那里有正确的语法会更理想。 :)

以上是关于Java Spring Hibernate:模型类主键自动递增字段:在字段上设置自动和手动的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中,Spring 无需任何脚本即可维护数据库

EJB+JPA+DAO+Hibernate/MyBatis+Spring

Java - Spring Boot - Hibernate - JPA(@ManyToOne 发布错误)

2017.10.13 Java的 三大框架:Struts+Hibernate+Spring

无法在 IntelliJ IDEA 中生成 JPA Hibernate 元模型类

Spring+Hibernate整合