【问题标题】:How to assign value to autogenrated ID in Spring JPA如何在 Spring JPA 中为自动生成的 ID 赋值
【发布时间】:2017-08-03 15:11:39
【问题描述】:
@Entity
public class Categorie {

    private Long id;
    private String nom;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }
}

我需要的是:

1) id == null(id没有赋值),策略是自增

2) id != null (id 已赋值),将实体赋值给持久化

请帮忙

【问题讨论】:

  • 似乎你想打破 JPA 的想法。为什么?举个真实的例子
  • 我不明白你想要达到什么目的。如果 id 存在或不存在,对 merge() 或 persist() 的调用将更新或插入。
  • 您对自动生成的 ID 有一个奇怪的想法。 ID 自动生成不是后备策略;在应用时,它是 策略。您无法为自动生成 ID 的任何类型的实体选择 ID。
  • 你为什么要做这样的事情?
  • JPA 不允许这种情况;它要么分配值(当您指定 @GeneratedValue 时)或不分配值(当未指定时)。我知道 DataNucleus JPA 提供了完全按照您的意愿执行的选项(仅在 null 时生成),但这是供应商扩展

标签: java spring jpa spring-boot spring-data-jpa


【解决方案1】:

为此,您必须删除自动生成的注释。通过从数据库中手动调用序列的 nextval 来获取自动生成的 id,然后将其分配给实体

从实体类中移除序列生成器

@Id
public Long getId() {
    return id;
}

检查 id 是否存在,否则从数据库中获取它

if(catagorieObject.getId()==null){
catogorieObject.setId(getidFromSeq()); 
}

通过调用获取序列id

public Long getidFromSeq(){
 .......
String query="select SOME_SEQUENCE.nextVal from dual";
 .....
}

【讨论】:

  • 我发现这个异常“嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown table 'SOME_SEQUENCE'”
  • 男人! 'SOME_SEQUENCE' 是我提供的虚拟序列名称,因为您没有在 @GeneratedValue() 中提供序列生成器的名称。将 SOME_SEQUENCE 替换为为您的类别实体创建的序列
【解决方案2】:

通过 EntityManager#merge() 合并实体实例,而不是使用 EntityManager#persist() 持久化实体实例

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 2022-01-18
    • 2018-04-25
    • 2016-07-23
    • 2018-06-22
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多