【问题标题】:Spring data JPA saveAndFlush and cannot get auto increment fieldSpring数据JPA saveAndFlush并且无法获取自动增量字段
【发布时间】:2019-12-18 09:26:53
【问题描述】:

我有带有@Id(主键)的对象,这是一些业务 UIID 字段,出于某些原因我想要另一个 Long 技术 ID,但是在保存对象时我从 getObjectId 字段中得到 null:

@Id
private String id;

@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "object_id")
private Long objectId;

public Long getObjectId() {
    return objectId;
}

public void setObjectId(Long objectId) {
    this.objectId = objectId;
}

我有这个存储类:

   interface MyObjectStorage extends JpaRepository<MyObject, String>

这就是我保存它的方式:

 final MyObject saved = storage.saveAndFlush(toSave);
 saved.objectId is null here..

在我的 MySQL 数据库中,objectId 字段被标记为非空自动增量..

PS。而且我不希望 JPA 在执行 findById 时使用这个 objectId 字段。

【问题讨论】:

标签: java jpa spring-data-jpa


【解决方案1】:

Hibernate/JPA 无法自动为您的非 ID 属性创建值。 @GeneratedValue 注解仅与@Id 结合使用以创建自动编号。

forum 中建议的解决方案(或解决方法)是使用生成的 Id 创建一个单独的实体,如下所示:

 @Entity
    public class GeneralSequenceNumber {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column(name = "object_id")
       private Long objectId;
    }

    @Entity 
    public class MyEntity {
      @Id ..
      private Long id;

      @OneToOne(...)
      private GeneralSequnceNumber myVal;
    }

【讨论】:

    【解决方案2】:

    试试下面的代码 @Id 必须是 Integer 或 Long 类型

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "object_id")
    private Long objectId;
    
    private String id;
    
    public Long getObjectId() {
        return objectId;
    }
    
    public void setObjectId(Long objectId) {
        this.objectId = objectId;
    }
    

    interface MyObjectStorage extends JpaRepository&lt;MyObject, Long&gt;

    【讨论】:

    • 我不能,你从 id 字段中删除了@Id
    • @Id 必须是 int 或 Long
    • 不是,当你有 java UUID 字段时,它是 db 中的 varchar 列。在 Java 中你有 new UUID() 并且在创建数据对象时你做 id = myObject.getId().getId().toString();
    • @michealAtmi 请注意,如果您有一个来自 21 世纪的数据库(不知道 MySQL 是否是),Hibernate 完美地乐于使用真正的 UUID 列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2014-02-07
    • 2018-04-21
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多