Сохраните все поля правильно в MySQL - PullRequest
0 голосов
/ 16 февраля 2019

Я работаю с небольшим 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, я обнаруживаю, что отметка времени продукта и идентификатор запаса отсутствуют.

enter image description here

Для метки времени продукта мне нужно использовать insertable = false, updatable = false, в противном случае я получаю ошибку.Не уверен, почему идентификатор акции не сохраняется.Я могу предоставить репо и сервисный код по запросу.

Как правильно сохранить данные в MySQL?

ОБНОВЛЕНИЕ

Когда я удалил аннотацию @Id из Stock и переименовал ее вid1, я могу сохранить значение в базе данных.Я все еще не могу сохранить временную метку для продукта в базе данных.

enter image description here

1 Ответ

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

Чего мне не хватает, так это почему вы вообще имеете дело с Product и Stock?Product и Stock используют точно такое же представление, зачем вставлять Stock?

Но все равно.Вы встраиваете , что означает, что эти столбцы будут считаться частью одной таблицы базы данных.

И вы передаете в двух разных id s, "Product1 ID" и "Stock ID".Вы также отображаете один и тот же столбец id на два разных поля, Product#id и Stock#id, которые, как я думаю, не должен обрабатывать JPA.

Вы также указываете два раза@Id аннотация, которая не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...