Я работаю с небольшим API, где у меня есть все данные до того, как я сохранюсь в базе данных, и я могу распечатать их соответствующим образом.Итак, кажется, что код работает как задумано, но я не смог сохранить их в MySQL.Предоставляются классы сущностей,
@Entity
public class Product {
@Id
@Column(name = "id")
private String id;
@Column(insertable = false, updatable = false, name = "timestamp")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
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;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Timestamp getTimestamp() {
return timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public Stock getStock() {
return stock;
}
public void setStock(Stock stock) {
this.stock = stock;
}
}
@Embeddable
public class Stock {
@Id
@Column(name = "id")
private String id;
@Column(name = "timestamp")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
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;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Timestamp getTimestamp() {
return timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
API представлен ниже,
@RestController
@RequestMapping("/api/v1/products")
public class ProductAPI {
@Autowired
private ProductService service;
/*
*
* $ curl -i -X POST -H "Content-Type:application/json" -d "{ \"id\": \"Product1 ID\", \"timestamp\": \"2017-07-16 22:54:01.754\", \"stock\" : { \"id\": \"Stock ID\", \"timestamp\": \"3000-07-16 22:54:01.754\", \"quantity\": \"350\" }}" http://localhost:8080/api/v1/products/createProduct
* */
@PostMapping(value = "/createProduct", consumes = "application/json", produces = "application/json")
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
System.out.println("\n");
System.out.println("Product ID " + product.getId());
System.out.println("Product timestamp " +product.getTimestamp());
System.out.println("Stock ID " +product.getStock().getId());
System.out.println("Stock timestamp " +product.getStock().getTimestamp());
System.out.println("Stock quantity " +product.getStock().getQuantity());
System.out.println("\n");
service.save(product);
return ResponseEntity.status(HttpStatus.CREATED).body(product);
}
}
Я сделал этот вызов cURL для постоянной операции в базе данных,
$ curl -i -X POST -H "Content-Type:application/json" -d "{ \"id\": \"Product1 ID\", \"timestamp\": \"2017-07-16 22:54:01.754\", \"stock\" : { \"id\": \"Stock ID\", \"timestamp\": \"3000-07-16 22:54:01.754\", \"quantity\": \"350\" }}" http://localhost:8080/api/v1/products/createProduct
В моей печати написано, что все данные были получены в соответствии с пожеланиями,
Product ID Product1 ID
Product timestamp 2017-07-17 00:54:01.754
Stock ID Stock ID
Stock timestamp 3000-07-17 00:54:01.754
Stock quantity 350
Это хорошо, но, когда я просматриваю базу данных MySQL, я обнаруживаю, что отметка времени продукта и идентификатор запаса отсутствуют.
Для метки времени продукта мне нужно использовать insertable = false, updatable = false
, в противном случае я получаю ошибку.Не уверен, почему идентификатор акции не сохраняется.Я могу предоставить репо и сервисный код по запросу.
Как правильно сохранить данные в MySQL?
ОБНОВЛЕНИЕ
Когда я удалил аннотацию @Id из Stock и переименовал ее вid1, я могу сохранить значение в базе данных.Я все еще не могу сохранить временную метку для продукта в базе данных.