Spring Boot java.sql.SQLException: поле 'id' не имеет значения по умолчанию - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю с проектом Java и Spring Boot, где я собираюсь выполнить базовую настройку.Запрос GET для одного объекта должен возвращать мне JSON следующим образом:

 {
   "productId": “string", // id of the requested product, e.g. "vegetable-123" 
  "requestTimestamp": “dateTime", // datetime in UTC when requested the stock 

  "stock": {

     "id": "string", 
     "timestamp": 
     "dateTime" "quantity": "integer"

   } 
}

Я делаю предоставленные модели,

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name ="id")
    private String id;

    @Column(insertable = false, updatable = false)
    private java.sql.Timestamp timestamp;

    @Embedded
    private Stock stock;

    public Product() {

    }

    public Product(String id, Timestamp timestamp, Stock stock) {
        this.id = id;
        this.timestamp = timestamp;
        this.stock = stock;
    }
}



@Embeddable
public class Stock {

    @Id
    @Column(name = "stockId")
    private String id;

    @Column(name = "s_timestamp")
    private java.sql.Timestamp timestamp;

    @Column(name = "quantity")
    private int quantity;

    public Stock() {

    }

    public Stock(String id, Timestamp timestamp, int quantity) {

        this.id = id;
        this.timestamp = timestamp;
        this.quantity = quantity;
    }
}

Хранилище приведено ниже,

@Repository
public interface ProductRepository extends CrudRepository<Product, String>{

}

Класс обслуживания здесь,

@Service
public class ProductService {

    @Autowired
    private ProductRepository repository;

    public Optional<Product> findById(String id) {
        return repository.findById(id);
    }

    public List<Product> findAll() {
        return (List<Product>) repository.findAll();
    }

    public Product save(Product product) {
        return repository.save(product);
    }
}

Я пытался POST продукта с помощью следующего запроса API,

@RestController
@RequestMapping("/api/v1/products")
public class ProductAPI {


    @Autowired
    private ProductService service;



    @PostMapping(value = "/createProduct", consumes = "application/json", produces = "application/json")
    public ResponseEntity<Product> createProduct(@RequestBody Product product) {

        service.save(product);
        return ResponseEntity.status(HttpStatus.CREATED).body(product);
    }

}

Я выполняю это через cURL,

$ curl -i -X POST -H "Content-Type:application/json" -d "{\"id\" : \"Apple Inc\",\"timestamp\" : \"2017-07-16T22:54:01.754Z\",\"stockId\" : \"Apple Stock\", \"s_timestamp\": \"2018-07-16T22:54:01.754Z\", \"quantity\": \"115\"}" http://localhost:8080/api/v1/products/createProduct

Сразу же я получаю ответ через терминал,

HTTP/1.1 500 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 14 Feb 2019 14:04:20 GMT
Connection: close

{"timestamp":"2019-02-14T14:04:20.482+0000","status":500,"error":"Internal Server Error","message":"could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement","path":"/api/v1/products/createProduct"}

В IDE отображается сообщение,

java.sql.SQLException: Field 'id' doesn't have a default value
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.15.jar:8.0.15]

Как мне предоставитьзначение по умолчанию id?

1 Ответ

0 голосов
/ 14 февраля 2019

Вот ошибка:

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name ="id")
private String id;

JPA не может сгенерировать String первичный ключ таким образом Информация .

Попробуйте что-то вродеэто:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "id")
private String id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...