У меня есть собственный класс, который представляет файловую структуру .csv, которая позже считывается в arrayList этого класса.Он имеет следующие теги:
public class InputFile {
public enum Status {
IN_STOCK,
OUT_OF_STOCK
}
private int lineNumber;
private String sku;
private Status statusCode;
private Date orderDate;
public InputFile(int lineNumber, String sku, Status status, Date orderDate) {
this.lineNumber = lineNumber;
this.sku = sku;
statusCode = status;
setOrderDate(orderDate);
}
public Status getStatusCode() {
return statusCode;
}
public void setStatusCode(Status input) {
statusCode = input;
}
Вот упрощенный файл .csv:
LineNumber;SKU;Status;OrderDate
1;553555254;IN_STOCK;2018-04-21
2;668470653;IN_STOCK;2018-05-08
3;899395925;OUT_OF_STOCK;2018-06-06
Когда я читаю их в arrayList и помещаю отдельные состояния в консоль для проверки,он показывает правильно (IN_STOCK, OUT_OF_STOCK).Однако, когда я пытаюсь вставить его в базу данных, он усекается:
java.sql.SQLException: данные усекаются для столбца 'Status' в строке 1
Здесьэто код для загрузки базы данных:
try {
String orderItemQuery = "INSERT INTO `order_processing`.`order_item` (`OrderItemId`, `OrderId`, `SalePrice`, `ShippingPrice`, `Sku`, `Status`)" + "VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement orderItemStmt = conn.prepareStatement(orderItemQuery);
for (InputFile i : CSVManager.getList())
{
orderItemStmt.setInt (1, i.getOrderItemId());
orderItemStmt.setInt(2,i.getOrderId());
orderItemStmt.setDouble (3, i.getSalePrice());
orderItemStmt.setDouble (4, i.getShippingPrice());
orderItemStmt.setString (5, i.getSku());
orderItemStmt.setObject(6, InputFile.Status.valueOf(i.getStatusCode().toString()));
orderItemStmt.execute();
}
}
catch (Exception e)
{
...
}
А вот .sql для таблицы базы данных:
create table order_item
(
OrderItemId int not null
primary key,
OrderId int not null,
SalePrice decimal not null,
ShippingPrice decimal not null,
TotalItemPrice decimal AS (ShippingPrice + SalePrice) not null,
SKU varchar(25) not null,
Status enum ('OUT_OF_STOCK', 'IN_STOCK') not null,
constraint order_item_order_OrderId_fk
foreign key (OrderId) references `order` (OrderId)
);
Чего не хватает?Почему перечисление усекается?
РЕДАКТИРОВАТЬ: Проблема заключалась в том, что типы перечисления Java имеют другие порядковые номера, чем MYSQL.Java начинает отсчет с 0, а MYSQL - с 1. Чтобы устранить разницу, в моих перечислениях необходимо внести изменения в порядковый список:
public enum Status {
OUT_OF_STOCK (1),
IN_STOCK (2);
private int status;
private Status (final int status) {
this.status = status;
}
public int getStatus() {
return status;
}
}
Затем образец вставки данных в базу данных:
orderItemStmt.setInt(6, i.getStatusCode().getStatus());