Неверно создаются связи в java
Имеется JSON:
{
"truckNumber":"test",
"comments":"test",
"activity":"hello",
"updateMode" : "-",
"carrierName":"test",
"truckType":"inbound",
"trailerNumber":" ",
"carrierCode":"Code",
"driverName":" ",
"reference" : "testTrip000",
"orders":[
{
"reference":"ST00013246_40537",
"cargo":[
{
"cargoNumber":"55522532913"
},
{
"cargoNumber":"55522532914"
},
{
"cargoNumber":"55522532915"
},
{
"cargoNumber":"55522532916"
},
{
"cargoNumber":"55522532876"
},
{
"cargoNumber":"55522532877"
}
]
},
{
"reference":"ST00013246_20849",
"cargo":[
{
"cargoNumber":"55522543768"
}
]
},
{
"reference":"LO0605269",
"cargo":[
{
"cargoNumber":"84642134"
},
{
"cargoNumber":"84642141"
},
{
"cargoNumber":"84642158"
}
]
},
{
"reference":"LO0620165",
"cargo":[
{
"cargoNumber":"84642165"
},
{
"cargoNumber":"84642172"
},
{
"cargoNumber":"84642189"
},
{
"cargoNumber":"84642196"
},
{
"cargoNumber":"84642202"
},
{
"cargoNumber":"84642219"
},
{
"cargoNumber":"84642226"
}
]
},
{
"reference":"LO0606854",
"cargo":[
{
"cargoNumber":"84642233"
},
{
"cargoNumber":"84642240"
},
{
"cargoNumber":"84642257"
},
{
"cargoNumber":"84642264"
},
{
"cargoNumber":"84642271"
},
{
"cargoNumber":"84642288"
}
]
},
{
"reference":"CHK-275696",
"cargo":[
{
"cargoNumber":"84491350"
}
]
},
{
"reference":"ST00012903_20849",
"cargo":[
{
"cargoNumber":"55522543769"
},
{
"cargoNumber":"55522543770"
}
]
},
{
"reference":"LO0606863",
"cargo":[
{
"cargoNumber":"84645814"
},
{
"cargoNumber":"84645821"
},
{
"cargoNumber":"84645838"
},
{
"cargoNumber":"84645845"
},
{
"cargoNumber":"84645852"
}
]
},
{
"reference":"LO0605275",
"cargo":[
{
"cargoNumber":"84645869"
},
{
"cargoNumber":"84645876"
},
{
"cargoNumber":"84645883"
}
]
},
{
"reference":"LO0620192",
"cargo":[
{
"cargoNumber":"84645890"
},
{
"cargoNumber":"84645906"
},
{
"cargoNumber":"84645913"
},
{
"cargoNumber":"84645920"
},
{
"cargoNumber":"84645937"
},
{
"cargoNumber":"84645944"
},
{
"cargoNumber":"84645951"
},
{
"cargoNumber":"84645968"
},
{
"cargoNumber":"84645975"
},
{
"cargoNumber":"84645982"
},
{
"cargoNumber":"84645999"
}
]
}
],
}
Необходимо пройтись по всем массивам "orders" и привязать "cargos" относящиеся к ним.
org.json.simple.JSONArray secondArray = (org.json.simple.JSONArray) jsonHead.get("orders");
if (secondArray != null) {
for (Object value : secondArray) {
JSONObject ordersObject = (JSONObject) value;
Orders ordersO = ordersService.getByReference(ordersObject.get("reference").toString());
if (ordersO == null) {
ordersO = new Orders();
if (ordersObject.get("reference") != null) {
ordersO.setOrderReference(ordersObject.get("reference").toString());
}
if (ordersObject.get("contentType") != null) {
ordersO.setContentType(ordersObject.get("contentType").toString());
}
if (ordersObject.get("supplierName") != null) {
ordersO.setSupplier(ordersObject.get("supplierName").toString());
}
if (ordersObject.get("orderType") != null) {
ordersO.setOrderType(ordersObject.get("orderType").toString());
}
if (ordersObject.get("consigneeName") != null) {
ordersO.setConsignee(ordersObject.get("consigneeName").toString());
}
if (ordersObject.get("comments") != null) {
ordersO.setComments(ordersObject.get("comments").toString());
}
} else {
if (ordersO.getInboundTrucks().size() != 0) {
if (ordersO.getInboundTrucks().get(0) != null) {
inboundTruck = ordersO.getInboundTrucks().get(0);
}
}
if (jsonHead.get("truckNumber") != null) {
inboundTruck.setTruckNumber(jsonHead.get("truckNumber").toString());
}
if (jsonHead.get("driverName") != null) {
inboundTruck.setDriverName(jsonHead.get("driverName").toString());
}
}
ordersList.clear();
cargoSet.clear();
ordersList.add(ordersO);
org.json.simple.JSONArray cargoArray = (org.json.simple.JSONArray) ordersObject.get("cargo");
if (ordersObject.get("cargo") != null) {
for (Object o : cargoArray) {
JSONObject ordersCargo = (JSONObject) o;
if (ordersCargo.get("cargoNumber") != null) {
Cargo cargoOrder = cargoService.getByNumber(ordersCargo.get("cargoNumber").toString());
if (cargoOrder != null) {
logger.info(cargoOrder.getCargoNumber() + " ");
} else {
cargoOrder = new Cargo();
cargoOrder.setCargoNumber(ordersCargo.get("cargoNumber").toString());
if (ordersObject.get("supplierName") != null) {
cargoOrder.setSupplier(ordersObject.get("supplierName").toString());
}
if (ordersObject.get("consigneeName") != null) {
cargoOrder.setConsignee(ordersObject.get("consigneeName").toString());
cargoOrder.setCriteria(ordersObject.get("consigneeName").toString());
}
cargoOrder.setInboundTrucks(inbList);
cargoOrder.setInBoundTruck(inboundTruck.getTruckNumber());
cargoSet.add(cargoOrder);
}
ordersO.setCargos(cargoSet);
cargoService.addCargo(cargoOrder);
ordersService.addOrders(ordersO);
}
}
}
}
inboundTruck.setCargos(cargoSet);
}
Связь создается либо по массиву "cargos" в последнем массив "orders" со всеми номерами заказов
Cargo.java:
@Entity
public class Cargo {
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "cargos", cascade = CascadeType.ALL)
private List<Orders> orders;
--- getters and setters ---
}
Orders.java
@Entity
public class Orders {
@ManyToMany
@JoinTable(name = "OrdersCargo",
joinColumns = @JoinColumn(name = "orderId", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "cargoId", referencedColumnName = "id"))
private Set<Cargo> cargos;
--- getters and setters ---
}
Ответы (1 шт):
Первое что меня смущает:
cargoSet, Вы инициализируете его за пределами обработки самого списка и фактически используете ссылку на один и тот же набор.
Вы в каждый Orders вставляете ссылку на один и тот же cargoSet.
При этом при каждой итерации Вы их чистите.
Не надо так делать!
просто инициализируйте данный набор непосредственно перед обработкой массива cargo
if (ordersObject.get("cargo") != null) {
// инициализируем cargoSet
Set<Cargo> cargoSet;
if(ordersO.getCargos()){
cargoSet = ordersO.getCargos();
}else{
cargoSet = new HashSet();
}
//и не придётся чистить потом
for (Object o : cargoArray) {
JSONObject ordersCargo = (JSONObject) o;
if (ordersCargo.get("cargoNumber") != null) {
//...
ordersO.setCargos(cargoSet);
cargoService.addCargo(cargoOrder);
ordersService.addOrders(ordersO);
}
}
}
Второе что меня смущает:
Внимательно посмотрите на код сверху.
В нем удалена обработка JSON, но вложенность сохранилась оригинальная.
Вы выполняете эти три строки при обработке одного единственного СargoOrder
ordersO.setCargos(cargoSet);
cargoService.addCargo(cargoOrder);
ordersService.addOrders(ordersO);
т.е. каждый раз когда Вы обрабатываете {"cargoNumber":"___________"}, Вы пытаетесь добавить Orders и Set<Cargo>
Не надо так!
Все должно обрабатываться на своём уровне.
ordersO.setCargos(cargoSet);
Необходимо вынести за скобки после обработки всего массива cargo
if (ordersObject.get("cargo") != null) {
for (Object o : cargoArray) {
//...
}
// ВОТ СЮДА!
ordersO.setCargos(cargoSet);
}
А строку
ordersService.addOrders(ordersO);
необходимо перенести после обработки всего Orders
if (secondArray != null) {
for (Object value : secondArray) {
JSONObject ordersObject = (JSONObject) value;
Orders ordersO = ordersService.getByReference(ordersObject.get("reference").toString());
// ...
// ОБРАБОТКА ORDERS
// ...
// И перед самым закрытием
ordersService.addOrders(ordersO);
}
}
А вот строка
cargoService.addCargo(cargoOrder);
остаётся на прежнем уровне.
Третье что меня смущает:
inboundTruck.setCargos(cargoSet);
Вы используете cargoSet за пределами цикла в котором Вы обрабатываете список cargo в конкретном orders
Я не знаю логики работы InboundTruck::setCargos(), но одно могу сказать точно: так делать нельзя.
Вы и так каждый раз чистите этот набор в каждой итерации. И Вы установите в inboundTruck только последний обработанный набор, что очень напоминает описанное вами поведение.
В зависимости от логики вам нужно:
- либо спустить
inboundTruck.setCargos(cargoSet);туда же где выполняетсяordersO.setCargos(cargoSet); - либо создайте второй
Set<Cargo>в котором Вы будете агрегировать всеCargoOrderво всем JSON'e и его уже добавляйте вinboundTruck.setCargos(ultimateCargoSet);