【问题标题】:JPA, HIBERNATE. How to get next value from @TableGeneratorJPA,休眠。如何从@TableGenerator 获取下一个值
【发布时间】:2017-01-08 03:16:35
【问题描述】:

我有一个具有以下主键生成策略的实体类

@Id
@Column(name = "id", nullable = false)
@TableGenerator(name = "USERGENERATOR", table = "my_sequences", pkColumnName = "sequence_name", pkColumnValue = "user_id", valueColumnName = "next_value")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "USERGENERATOR")
protected Integer id;

这一直很好,直到出现一个新要求,我需要使用本机查询插入新行。由于实体继承策略 (@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)) 到位,主键列不使用 auto_increment。

我想知道是否有办法使用 EntityManager 向表生成器询问下一个值。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我认为您无法通过任何公共 API 访问 @TableGenerator,但使用本机 SQL 获取下一个值很容易。只需使用这两个查询:

    -- get the current value
    select next_value from my_sequences where sequence_name = 'user_id';
    -- update value
    update my_sequences set next_value = next_value + 1;
    

    如果@TableGenerator 同时获取下一个值,则存在冲突风险。

    【讨论】:

      【解决方案2】:

      当你添加一个新元素时,你需要像这样将你的@GeneratedValue(strategy = GenerationType.TABLE, generator = "USERGENERATOR") 更改为@GeneratedValue(strategy = GenerationType.IDENTITY),它将添加 1 个自动

      【讨论】:

      • 因为这是你的id,应该是唯一的@chege 你也可以使用strategy = GenerationType.AUTO,它会自动递增
      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 2015-09-12
      • 2013-05-06
      • 2011-06-06
      相关资源
      最近更新 更多