Это пример двунаправленной связи между объектами Java в веб-службе REST с API Джексона .
- Предположим, у нас есть двунаправленные отношения между двумя сущностями: Родителем и Ребенком.
- Использование MySQL Workbench для генерации файла схемы SQL для этих двух таблиц.
0102030405060708091011121314151617181920212223242526272829303132
DROPSCHEMAIF EXISTS `bidirectional_schema` ;CREATESCHEMAIFNOTEXISTS `bidirectional_schema`DEFAULTCHARACTERSETutf8 ;USE `bidirectional_schema` ;-- ------------------------------------------------------- Table `bidirectional_schema`.`PARENT`-- -----------------------------------------------------DROPTABLEIF EXISTS `bidirectional_schema`.`PARENT` ;CREATETABLEIFNOTEXISTS `bidirectional_schema`.`PARENT` (`PARENT_ID`INTNOTNULL,`PARENT_CONTENT`VARCHAR(45)NULL,PRIMARYKEY(`PARENT_ID`) )ENGINE = InnoDB;-- ------------------------------------------------------- Table `bidirectional_schema`.`CHILD`-- -----------------------------------------------------DROPTABLEIF EXISTS `bidirectional_schema`.`CHILD` ;CREATETABLEIFNOTEXISTS `bidirectional_schema`.`CHILD` (`CHILD_ID`INTNOTNULL,`CHILD_CONTENT`VARCHAR(45)NULL,`PARENT_PARENT_ID`INTNOTNULL,PRIMARYKEY(`CHILD_ID`) ,INDEX`fk_CHILD_PARENT_idx` (`PARENT_PARENT_ID`ASC) ,CONSTRAINT`fk_CHILD_PARENT`FOREIGNKEY(`PARENT_PARENT_ID` )REFERENCES`bidirectional_schema`.`PARENT` (`PARENT_ID` )ONDELETENOACTIONONUPDATENOACTION)ENGINE = InnoDB; - Затем мы вставим некоторые данные в эти две таблицы с помощью этих операторов вставки:
123
INSERT INTO `bidirectional_schema`.`parent` (`PARENT_ID`, `PARENT_CONTENT`) VALUES ('1','First Parent');INSERT INTO `bidirectional_schema`.`child` (`CHILD_ID`, `CHILD_CONTENT`, `PARENT_PARENT_ID`) VALUES ('1','First Child','1');INSERT INTO `bidirectional_schema`.`child` (`CHILD_ID`, `CHILD_CONTENT`, `PARENT_PARENT_ID`) VALUES ('2','Second Child','1'); - Зависимости Maven для API Джексона, необходимые для этого примера.
010203040506070809101112131415
<dependency><groupid>com.fasterxml.jackson.core</groupid><artifactid>jackson-annotations</artifactid><version>2.5.2</version></dependency><dependency><groupid>com.fasterxml.jackson.core</groupid><artifactid>jackson-core</artifactid><version>2.5.2</version></dependency><dependency><groupid>com.fasterxml.jackson.core</groupid><artifactid>jackson-databind</artifactid><version>2.5.2</version></dependency>Кроме того, вы можете подобрать требуемые зависимости Java EE по этой ссылке: https://wikis.oracle.com/display/GlassFish/Java+EE+7+Maven+Coordinates
- Использование Eclipse для генерации сущностей из приведенных выше таблиц. Файл -> Создать -> Другое, затем в мастере выберите JPA Entities из таблиц. Появится мастер для создания соединения с уже созданной схемой. Затем выберите две таблицы: дочернюю и родительскую. Наконец убедитесь, что «Список сгенерированных классов в persistence.xml».
Вы можете продолжить и следовать настройкам по умолчанию, но я выбрал настройки отображения как показано ниже:
- В файле persistence.xml нет ничего особенного. Но есть два момента, которые следует учитывать. Во-первых, я не указывал поставщика постоянства, поскольку я склонен использовать WildFly, поэтому приложение будет использовать поставщик постоянства по умолчанию, который называется Hibernate. Во-вторых, я создал источник данных в WildFly, чтобы его можно было использовать для подключения к нашей схеме. В-третьих, я использовал EclipseLink, поэтому я использую этот JPA-провайдер org.eclipse.persistence.jpa.PersistenceProvider. Проверьте этот пост, чтобы указать WildFly на EclipseLink.
123456789
<?xmlversion="1.0"encoding="UTF-8"?><persistenceversion="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"><persistence-unitname="BidirectionalPU"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><jta-data-source>java:jboss/datasources/Bidirectional_DataSource</jta-data-source><class>com.ithinkisink.entity.Child</class><class>com.ithinkisink.entity.Parent</class></persistence-unit></persistence> - Первый класс, который мы реализуем, — это класс ApplicationConfiguration, который будет указывать на родительский путь наших будущих служб REST.
010203040506070809101112131415
packagecom.ithinkisink;importjavax.inject.Singleton;importjavax.ws.rs.ApplicationPath;importjavax.ws.rs.core.Application;/**** @author Belal**/@Singleton@ApplicationPath("rest")publicclassApplicationConfigurationextendsApplication {} - Затем мы создадим класс MyService, который будет иметь два веб-сервиса REST. Первый извлечет родителя с выбранными детьми. Второй вариант противоположен этому и будет извлекать ребенка с его родителями.
0102030405060708091011121314151617181920212223242526272829303132333435363738
packagecom.ithinkisink.service;packagecom.ithinkisink.service;importjavax.ejb.EJB;importjavax.ws.rs.GET;importjavax.ws.rs.Path;importjavax.ws.rs.Produces;importjavax.ws.rs.core.MediaType;importcom.ithinkisink.entity.Child;importcom.ithinkisink.entity.Parent;/**** @author Belal**/@Path("MyService")publicclassMyService {@EJBMyServiceDAO myServiceDAO;@GET@Path("/retrieveParentWithChildren")@Produces(MediaType.APPLICATION_JSON)publicParent retrieveParentWithChildren() {returnmyServiceDAO.retrieveParentWithChildren();}@GET@Path("/retrieveChildWithParent")@Produces(MediaType.APPLICATION_JSON)publicChild retrieveChildWithParent() {returnmyServiceDAO.retrieveChildWithParent();}} - Затем мы создадим ServiceDAO и заметим, что EntityManager внедряется с подключением к постоянному модулю, который мы уже определили в файле persistence.xml. Я передал название единицы персистентности, чтобы прояснить этот момент. Но вы можете просто использовать аннотацию @PersistenceContext без указания атрибута unitName, тогда он будет использовать наш модуль постоянства, поскольку в нашем приложении не определено никакого другого модуля постоянства.
010203040506070809101112131415161718192021222324252627282930
packagecom.ithinkisink.service;importjavax.ejb.Stateless;importjavax.persistence.EntityManager;importjavax.persistence.PersistenceContext;importjavax.persistence.Query;importcom.ithinkisink.entity.Child;importcom.ithinkisink.entity.Parent;@StatelesspublicclassMyServiceDAO {@PersistenceContext(unitName="BidirectionalPU")protectedEntityManager entityManager;publicParent retrieveParentWithChildren() {intparentId =1;Query q = entityManager.createQuery("SELECT p FROM "+"Parent "+"p JOIN FETCH p.childs WHERE p.parentId = :parentId ");q.setParameter("parentId", parentId);return(q.getResultList().size() >0) ? (Parent) q.getResultList().get(0) :null;}publicChild retrieveChildWithParent() {intchildId =1;Query q = entityManager.createQuery("SELECT c FROM "+"Child "+"c JOIN FETCH c.parent WHERE c.childId = :childId ");q.setParameter("childId", childId);return(q.getResultList().size() >0) ? (Child) q.getResultList().get(0) :null;}} - Теперь, когда наше приложение готово к тестированию, добавим его на сервер WildFly. Тогда запуск сервера должен быть успешным.
- Для простоты я использовал Postman для тестирования запущенных веб-сервисов REST. Итак, ниже приведены скриншоты из результатов на Почтальоне.
- Вы можете найти полный пример на моем Github по этой ссылке: https://github.com/belalgalal/Blogging/tree/master/BidirectionalRESTJson
| Ссылка: | Двунаправленные отношения с Джексоном в веб-сервисах REST в WildFly от нашего партнера JCG Белала Галала в « Я думаю, я тону»! блог. |





