#java #spring-boot #hibernate #jpa #orm
Вопрос:
Приведенный ниже json-это то, что было отправлено мне, когда я нашел Bypincode. Я создал отношения между ними в следующем соответствии с ответом json. Вот такие отношения.
{ "RequestIdentifier": "00000000-0000-0000-0000-000000000000", "Status": { "Name": "string", "Code": 0, "Message": "string" }, "Response": { "Person": { "Pin": "string", "LastName": "string", "FirstName": "string", "FatherName": "string", "BirthDate": "string" }, "Company": { "Voen": "string", "Name": "string", "PersonType": "string", "Persons": [ { "Pin": "string", "LastName": "string", "FirstName": "string", "FatherName": "string", "BirthDate": "string" } ] }, "Farms": [ { "Id": 0, "Name": "string", "Fields": [ { "VillageName": "string", "DocType": "string", "FieldAmount": 0, "Unit": "string", "Plants": [ { "Name": "string", "FieldAmount": 0, "Unit": "string" } ] } ], "Animals": [ { "Sort": "string", "Count": 0 } ], "Bees": [ { "Sort": "string", "Count": 0 } ] } ] } }
(Одна)Компания (Многим)Лицам
(Один)ФармИнфо До (Многих)фермерских полей
(Одно)Сельскохозяйственное Поле Для (Многих)Растений
(Один)ФармИнфо Для (Многих)Животных
(Один)ФармИнфо Для (Многих)Пчел
и, таким образом, сначала преобразую их в мой класс dto. Затем я хочу преобразовать их в свои классы сущностей и полностью сохранить в базе данных.
Это мой класс DTO.
@Data @NoArgsConstructor @AllArgsConstructor public class FarmInfoMainResult { @JsonProperty(value = "RequestIdentifier") private String requestIdentifier; @JsonProperty(value = "Status") private ResponseStatus status; @JsonProperty(value = "Response") private FarmInfoData response; }
and this is my business logic layer of method, which I want to that in here convertint the dto class to the BaseEntity class and at the end of I want to persist BaseEntity class to the database.
@Override public ResponseEntitylt;FarmInfoMainResultgt; findFarmInfoByPin(String pin, String username, String branchCode) { String requestIdentifier = UUID.randomUUID().toString(); ResponseEntitylt;FarmInfoMainResultgt; farmInfoPinServiceResponse = clientUtility.getForObject(farmInfoForPinUrl pin, requestIdentifier, FarmInfoMainResult.class); System.out.println("farmInfoPinServiceResponse " farmInfoPinServiceResponse.getBody()); /* Here are I want to convert farmInfoPinServiceResponse variable to the my Base Entity class and so persist it to the database, so that thus, values will be automatically added to them as they are related to each other in other relational databases. */ return farmInfoPinServiceResponse; } @Entity @Data @Builder @NoArgsConstructor @AllArgsConstructor public class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String requestIdentifier; @OneToOne(cascade = CascadeType.ALL) private Status status; @OneToOne(cascade = CascadeType.ALL) private Response response; }
But I am getting the following error in my Response class. basic' attribute type should not be a container
@Entity @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Response { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private PersonFarmInfo personFarmInfo; private CompanyFarmInfo companyFarmInfo; private FarmInfo farmInfo; private FarmFieldInfo farmFieldInfo; private FarmPlantInfo farmPlantInfo; private FarmAnimalInfo farmAnimalInfo; private FarmBeeInfo farmBeeInfo; @OneToOne(mappedBy = "response") private BaseEntity baseEntity; }
If I don’t create main entity class, there will be a situation like this. I will add the properties of each class that is in the dto to the properties of each of my entity class and print them to the database. But by insert to a single entity class I want others to be affected as well. I wanted to solve the issue by creating a main entity class like this, but I’m getting the following error.
As I said at the beginning, the codes below do this by separating them into parts. These codes my old version codes.
@Override public ResponseEntitylt;FarmInfoMainResultgt; findFarmInfoByPin(String pin, String username, String branchCode) { String requestIdentifier = UUID.randomUUID().toString(); ResponseEntitylt;FarmInfoMainResultgt; farmInfoPinServiceResponse = clientUtility.getForObject(farmInfoForPinUrl pin, requestIdentifier, FarmInfoMainResult.class); System.out.println("farmInfoPinServiceResponse " farmInfoPinServiceResponse.getBody()); saveFarmInfoPin(farmInfoPinServiceResponse.getBody(), username, branchCode, pin); return farmInfoPinServiceResponse; }
Here I am sending the object stored in dto to my saveFarmInfoPin method.Then this method works. Here, my method saves all my object values stored in dto separately.
private void saveFarmInfoPin(FarmInfoMainResult farmInfoMainResult, String username, String branchcode, String pin) { // try { if (farmInfoMainResult.getResponse() != null) { saveFarmInfoPersonPin(farmInfoMainResult.getResponse().getPerson(), farmInfoMainResult.getRequestIdentifier(), username, branchcode, pin); saveFarmInfoCompanyPin(farmInfoMainResult.getResponse().getCompany(), farmInfoMainResult.getRequestIdentifier(), username, branchcode); saveFarminfo(farmInfoMainResult.getResponse().getFarms()); /* } catch (Exception e) { e.printStackTrace(); } */ } }
Finally, my following methods divide each of my dto objects into parts, first converting them to my entity class, and then adding them to the database via repository.
private void saveFarmInfoPersonPin(FarmInfoPerson farmInfoPersonDto, String requestIdentifier, String username, String branchCode, String pin) { if (farmInfoPersonDto != null) { FarmPersonInfo newFarmInfoPerson = new FarmPersonInfo(); newFarmInfoPerson.setRequestIdentifier(requestIdentifier); newFarmInfoPerson.setBranchCode(branchCode); newFarmInfoPerson.setUsername(username); newFarmInfoPerson.setPin(pin); newFarmInfoPerson.setPin(farmInfoPersonDto.getPin()); newFarmInfoPerson.setFatherName(farmInfoPersonDto.getFatherName()); newFarmInfoPerson.setFirstName(farmInfoPersonDto.getFirstName()); newFarmInfoPerson.setBirthDate(farmInfoPersonDto.getBirthDate()); personFarmInfoRepository.save(newFarmInfoPerson); } } private void saveFarmInfoCompanyPin(FarmInfoCompany farmInfoCompany, String requestIdentifier, String username, String branchCode) { Listlt;FarmPersonInfogt; newFarmInfoPersonList = new ArrayListlt;gt;(); if (farmInfoCompany != null) { FarmCompanyInfo newCompanyFarmInfo = new FarmCompanyInfo(); newCompanyFarmInfo.setName(farmInfoCompany.getName()); newCompanyFarmInfo.setRequestIdentifier(requestIdentifier); newCompanyFarmInfo.setUsername(username); newCompanyFarmInfo.setBranchCode(branchCode); newCompanyFarmInfo.setPersonType(farmInfoCompany.getPersonType()); newCompanyFarmInfo.setVoen(farmInfoCompany.getVoen()); // CompanyFarmInfo companyFarmInfo = companyFarmInfoRepository.save(newCompanyFarmInfo); for (FarmInfoPerson farmInfoPerson : farmInfoCompany.getPersons()) { FarmPersonInfo personInfo = new FarmPersonInfo(); personInfo.setPin(farmInfoPerson.getPin()); personInfo.setFatherName(farmInfoPerson.getFatherName()); personInfo.setFirstName(farmInfoPerson.getFirstName()); personInfo.setBirthDate(farmInfoPerson.getBirthDate()); personInfo.setFarmCompanyInfo(newCompanyFarmInfo); newFarmInfoPersonList.add(personInfo); } personFarmInfoRepository.saveAll(newFarmInfoPersonList); } } private void saveFarminfo(Listlt;FarmInfoFarmgt; farmInfoFarms) { Listlt;FarmFieldInfogt; newFarmFieldInfoList = new ArrayListlt;gt;(); Listlt;FarmAnimalInfogt; newFarmAnimalInfoList = new ArrayListlt;gt;(); Listlt;FarmBeeInfogt; newFarmBeeInfoList = new ArrayListlt;gt;(); Listlt;FarmPlantInfogt; newFarmPlantInfoList = new ArrayListlt;gt;(); for (FarmInfoFarm farmInfoFarm : farmInfoFarms) { FarmInfo newFarmInfo = new FarmInfo(); newFarmInfo.setName(farmInfoFarm.getName()); newFarmInfo.setFarmInfoId(farmInfoFarm.getId()); FarmInfo farmInfo = farmInfoRepository.save(newFarmInfo); for (FarmInfoField farmInfoField : farmInfoFarm.getFields()) { FarmFieldInfo newFarmFieldInfo = new FarmFieldInfo(); newFarmFieldInfo.setVillageName(farmInfoField.getVillageName()); newFarmFieldInfo.setDocType(farmInfoField.getDocType()); newFarmFieldInfo.setFieldAmount(farmInfoField.getFieldAmount()); newFarmFieldInfo.setUnit(farmInfoField.getUnit()); newFarmFieldInfo.setFarmInfo(farmInfo); newFarmFieldInfoList.add(newFarmFieldInfo); for (FarmInfoPlant farmInfoPlant : farmInfoField.getPlants()) { FarmPlantInfo newfarmPlantInfo = new FarmPlantInfo(); newfarmPlantInfo.setName(farmInfoPlant.getName()); newfarmPlantInfo.setFieldAmount(farmInfoPlant.getFieldAmount()); newfarmPlantInfo.setUnit(farmInfoPlant.getUnit()); newfarmPlantInfo.setFarmFieldInfo(newFarmFieldInfo); newFarmPlantInfoList.add(newfarmPlantInfo); } farmPlantInfoRepository.saveAll(newFarmPlantInfoList); } farmFieldInfoRepository.saveAll(newFarmFieldInfoList); for (FarmInfoAnimal farmInfoAnimal : farmInfoFarm.getAnimals()) { FarmAnimalInfo newFarmAnimalInfo = new FarmAnimalInfo(); newFarmAnimalInfo.setCount(farmInfoAnimal.getCount()); newFarmAnimalInfo.setSort(farmInfoAnimal.getSort()); newFarmAnimalInfo.setFarmInfo(farmInfo); newFarmAnimalInfoList.add(newFarmAnimalInfo); } farmAnimalInfoRepository.saveAll(newFarmAnimalInfoList); for (FarmInfoBee farmInfoBee : farmInfoFarm.getBees()) { FarmBeeInfo newfarmBeeInfo = new FarmBeeInfo(); newfarmBeeInfo.setCount(farmInfoBee.getCount()); newfarmBeeInfo.setSort(farmInfoBee.getSort()); newfarmBeeInfo.setFarmInfo(farmInfo); newFarmBeeInfoList.add(newfarmBeeInfo); } farmBeeInfoRepository.saveAll(newFarmBeeInfoList); } }
Но, как я уже сказал, вместо того, чтобы разделять их все на отдельные части, могу ли я добавить все эти объекты в свой основной класс сущностей и объединить все эти частицы всего одним методом?
Я думаю о чем-то подобном, теперь я буду использовать джексона для преобразования всех значений в полученном мной значении json в классы, к которым оно принадлежит, затем я добавлю их в свой основной класс и, наконец, добавлю свой основной класс в свою базу данных. Поскольку основной класс уже будет иметь все отношения сам по себе, я думаю, что все они будут затронуты выполнением этой операции один раз.
Комментарии:
1. Не могли бы вы, пожалуйста, добавить свою трассировку стека? Спасибо!
2. Я не получаю ошибки, чтобы показать, что вы сказали в моем проекте.
3. Значит, вы не получаете такой ошибки, как
basic' attribute type should not be a container
? Есть ли у него более подробная информация?4. Это не ошибка компиляции, это просто предупреждающее сообщение об этом.
5. «Но я получаю следующую ошибку в своем классе ответов».. Это то, что вы написали. Это ошибка или предупреждение? Что же тогда не работает?