在WildFly的REST Web服务中与Jackson的双向关系

这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例。

  1. 假设我们在两个实体Parent和Child之间存在双向关系。

    bidirectional_relationship_tables
  2. 使用MySQL工作台为这两个表生成SQL模式文件。
    DROP SCHEMA IF EXISTS `bidirectional_schema` ;
    CREATE SCHEMA IF NOT EXISTS `bidirectional_schema` DEFAULT CHARACTER SET utf8 ;
    USE `bidirectional_schema` ;
    
    -- -----------------------------------------------------
    -- Table `bidirectional_schema`.`PARENT`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `bidirectional_schema`.`PARENT` ;
    
    CREATE  TABLE IF NOT EXISTS `bidirectional_schema`.`PARENT` (
      `PARENT_ID` INT NOT NULL ,
      `PARENT_CONTENT` VARCHAR(45) NULL ,
      PRIMARY KEY (`PARENT_ID`) )
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `bidirectional_schema`.`CHILD`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `bidirectional_schema`.`CHILD` ;
    
    CREATE  TABLE IF NOT EXISTS `bidirectional_schema`.`CHILD` (
      `CHILD_ID` INT NOT NULL ,
      `CHILD_CONTENT` VARCHAR(45) NULL ,
      `PARENT_PARENT_ID` INT NOT NULL ,
      PRIMARY KEY (`CHILD_ID`) ,
      INDEX `fk_CHILD_PARENT_idx` (`PARENT_PARENT_ID` ASC) ,
      CONSTRAINT `fk_CHILD_PARENT`
        FOREIGN KEY (`PARENT_PARENT_ID` )
        REFERENCES `bidirectional_schema`.`PARENT` (`PARENT_ID` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
  3. 然后,我们将通过此插入语句将数据插入到这两个表中:
    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');
  4. 本示例所需的Jackson API的Maven依赖项。
    <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

  5. 使用Eclipse从上表中生成实体。 File-> New-> Other,然后从向导中选择Tables中的JPA Entities。 将出现一个向导,以创建到已创建模式的连接。 然后选择两个表子级和父级。 最后,确保“列出persistence.xml中生成的类”。

    bidirectional_relationship_entities_generation_1

    您可以继续并遵循默认设置,但是我在下面将映射设置选择为:

    bidirectional_relationship_entities_generation_2

  6. persistence.xml没有什么花哨的。 但是有两点要考虑。 首先,我没有指定持久性提供程序,因为我倾向于使用WildFly,因此应用程序将使用默认的持久性提供程序Hibernate。 其次,我在WildFly上创建了一个数据源,以便可以将其用于连接到我们的模式。 第三,我使用了EclipseLink,这就是为什么我使用此JPA提供程序org.eclipse.persistence.jpa.PersistenceProvider的原因。 检查这篇文章,将WildFly指向EclipseLink。
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="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-unit name="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>
  7. 我们将实现的第一个类是ApplicationConfiguration类,它将指向即将到来的REST服务的父路径。
    package com.ithinkisink;
    
    import javax.inject.Singleton;
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    /**
     * 
     * @author Belal
     *
     */
    @Singleton
    @ApplicationPath("rest")
    public class ApplicationConfiguration extends Application {
    }
  8. 然后,我们将创建MyService类,该类将具有两个REST Web服务。 第一个将检索获取了孩子的父母。 第二个与此相反,它将检索一个提取了其父对象的孩子。
    package com.ithinkisink.service;
    
    package com.ithinkisink.service;
    
    import javax.ejb.EJB;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    import com.ithinkisink.entity.Child;
    import com.ithinkisink.entity.Parent;
    
    /**
     * 
     * @author Belal
     *
     */
    @Path("MyService")
    public class MyService {
    
     @EJB
     MyServiceDAO myServiceDAO;
     
     @GET
     @Path("/retrieveParentWithChildren")
     @Produces(MediaType.APPLICATION_JSON)
     public Parent retrieveParentWithChildren() {
      return myServiceDAO.retrieveParentWithChildren();
     }
     
     @GET
     @Path("/retrieveChildWithParent")
     @Produces(MediaType.APPLICATION_JSON)
     public Child retrieveChildWithParent() {
      return myServiceDAO.retrieveChildWithParent();
     }
    }
  9. 然后,我们将创建ServiceDAO,并注意EntityManager注入了与我们在persistence.xml中已定义的持久性单元的连接。 我通过了持久性单元的名称来明确这一点。 但是您可以只使用注释@PersistenceContext而不指定unitName属性,然后它将使用我们的持久性单元,因为在我们的应用程序中没有定义其他持久性单元。
    package com.ithinkisink.service;
    
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    
    import com.ithinkisink.entity.Child;
    import com.ithinkisink.entity.Parent;
    
    @Stateless
    public class MyServiceDAO {
     
     @PersistenceContext(unitName="BidirectionalPU")
     protected EntityManager entityManager;
     
     public Parent retrieveParentWithChildren() {
      int parentId = 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;
     }
     
     public Child retrieveChildWithParent() {
      int childId = 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;
     }
    }
  10. 现在我们的应用程序已准备好进行测试,可以将其添加到WildFly服务器。 然后启动服务器应该成功。
    bidorectional_relationship_wildfly
  11. 为了简单起见,我使用Postman来测试正在运行的REST Web服务。 因此,下面是Postman结果的屏幕截图。
    bidirectional_rest_1 bidirectional_rest_2

翻译自: https://www.javacodegeeks.com/2016/02/bidirectional-relationship-jackson-rest-web-services-wildfly.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值