在调用保存字符串 ID 之前,必须手动分配此类的 ID

Mat*_*llo 7 java hibernate jpa spring-data-jpa spring-boot

已经阅读了很多关于同一问题的问题,但我仍然无法解决这个问题。

String我的数据库需要有一个主键。

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MyClass {

    @Id
    private String myId;
    private String name;

    // getters and setters..

}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我在带注释的字段String中使用类型@Id,当我尝试保存对象时,Hibernate 会抛出异常。

ids for this class must be manually assigned before calling 
Run Code Online (Sandbox Code Playgroud)

是的,我正在为该字段设置一个值。

我发现的解决方法:

  1. 将注释添加@GeneratedValue到字段 - 不起作用
  2. 将字段类型更改为Integer- 这对我来说不可行
  3. 添加一个接收myId参数的构造函数public MyClass(String myId){ ... }- 不起作用
  4. 使用 UUID - 我不能,因为这个 id 是由 POST 请求中的字段设置的。

这些解决方法都不适合我。

更新

我正在使用 Spring Boot 和 Spring Data JPA。

我如何插入:

我有一个@PostMapping带注释的方法,它处理 POST 请求并调用执行一些业务逻辑的服务并调用我的存储库进行持久化。

我发布的请求:

{
    "myId": "myId",
    "name": "myName"
}
Run Code Online (Sandbox Code Playgroud)

MyService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    public MyClass save(MyClass myClass) {
        return myRepository.save(myClass); // save() should persist my object into the database
    }
}
Run Code Online (Sandbox Code Playgroud)

Pio*_*r R 5

尝试这种方法

\n\n
@Entity\npublic class MyClass{\n\n    @Id\n    @GeneratedValue(generator = \xe2\x80\x9cUUID\xe2\x80\x9d)\n    @GenericGenerator(\n        name = \xe2\x80\x9cUUID\xe2\x80\x9d,\n        strategy = \xe2\x80\x9corg.hibernate.id.UUIDGenerator\xe2\x80\x9d,\n    )\n    @Column(name = \xe2\x80\x9cid\xe2\x80\x9d, updatable = false, nullable = false)\n    private UUID id;\n\n    \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

=======================================

\n\n

我像这样调用,在我的环境中一切正常:

\n\n
@Autowired\nprivate EntityManager entityManager;\n\n@PostMapping("")\n@Transactional\npublic void add(@RequestBody MyClass myClass){\n        entityManager.persist(myClass);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并请求通过邮寄方式发送正文:

\n\n
{\n    "myId" : "213b2bbb1"\n}\n
Run Code Online (Sandbox Code Playgroud)\n