【问题标题】:Java Spring Hibernate : Model class primary key auto increment field : set automatic and manually on a fieldJava Spring Hibernate:模型类主键自动递增字段:在字段上设置自动和手动
【发布时间】: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

【问题讨论】:

    标签: java hibernate primary-key auto-increment setter


    【解决方案1】:

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

    它的代码如下所示:-

    @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 中环顾四周学习或理解的菜鸟来说,那里有正确的语法会更理想。 :)
    猜你喜欢
    • 2016-06-04
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多