Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么时候有DTO层?_Java_Json_Angularjs_Hibernate_Dto - Fatal编程技术网

Java 什么时候有DTO层?

Java 什么时候有DTO层?,java,json,angularjs,hibernate,dto,Java,Json,Angularjs,Hibernate,Dto,我正在开发一个web应用程序,前端使用AngularJS,后端使用Java Play框架。对于数据库访问,我使用 到目前为止,我有大约30个使用和生成JSON的服务,我直接发送Hibernate对象,而不是使用数据传输层 目前,由于Hibernate实体的双向引用,我面临递归调用问题。一些注释和JSON视图已经解决了这些问题,但是,为不同的服务方法配置这些视图正成为一个真正的问题,相应地为JSON转换注释实体实际上是在膨胀可爱的简单实体对象 目前我正在考虑一个简化通信的层,但是我不确定为每个服务

我正在开发一个web应用程序,前端使用AngularJS,后端使用Java Play框架。对于数据库访问,我使用

到目前为止,我有大约30个使用和生成JSON的服务,我直接发送Hibernate对象,而不是使用数据传输层

目前,由于Hibernate实体的双向引用,我面临递归调用问题。一些注释和JSON视图已经解决了这些问题,但是,为不同的服务方法配置这些视图正成为一个真正的问题,相应地为JSON转换注释实体实际上是在膨胀可爱的简单实体对象


目前我正在考虑一个简化通信的层,但是我不确定为每个服务准备请求和响应DTO对象所造成的开发和性能开销是否值得。这是个好主意吗?

DTO将使用实体对象使用的相同字符串池。若实体中有复杂对象,只需在DTO到实体和实体到DTO之间进行浅层复制即可


DTO的使用将防止在服务层方法中暴露实体设计。DTO的使用不应导致显著的性能问题。

实际上,您甚至可以通过使用DTO方法来提高性能,因为您可以查询更少的数据,假设DTO不是您实体模型的1:1副本。
我写了一篇关于使用实体模型所带来的问题以及如何使用Blaze Persistence实体视图有效地实现DTO方法的文章。也许你想尝试一下,看看它如何改进你的设计和性能

我采取的方法是为
DTO
对象编写
XSD
模式定义,然后使用插件生成实际的
pojo
。在my
entities
中,我添加了
到EntityType
fromEntityType
翻译方法。这将数据转换直接耦合到实体和控制服务。我不需要编写POJO,XSD可以作为文档。例如,一个实体

public class Product {
    private Long id;
    private String name;

    /**
     * Fill out properties from PurchaseOrderType. Copies all dependencies.   
     * @param productType {@link ProductType}
     * @return Product
     */
    public Product fromProductType(ProductType productType) {
        this.id = productType.getId();
        this.name = productType.getName();
        return this;
    }

    /**
     * Create and return ProductType representation. 
     * @return {@link ProductType}
     */
    public ProductType asProductType() {
        ProductType productType = new ProductType(); 
        productType.setId(id);
        productType.setName(name);
        return productType;
    }
    ... getters, setters, 
}
XSD定义:

<!-- product -->
<xsd:element name="productType">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:long" minOccurs="0"/>
            <xsd:element name="name" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

与主要影响性能的因素(如网络延迟和数据库访问)相比,DTO的开销可以忽略不计,但是我认为开销是一次又一次地为每个服务花费的开发工作。数据传输对象是有益的,特别是当您希望屏蔽来自不同数据模型表示的更改时。例如,从数据对象到业务对象。如果您注意到业务对象有频繁的更改,但数据部分保持不变,例如DTO将是有用的。例如,系统的不同层将与表示相同数据的不同模型交互。
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.13.2</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
/**
 * Rest endpoint for a ProductType
 * rest/productservice/getproduct/{id}
 * @param id @{link Long}
 * @return {@link ProductType}
 */
@GET
@Path("getproduct/{id}")
@Produces({MediaType.APPLICATION_JSON})
public ProductType getProduct(@PathParam("id") Long id) throws Exception {
    // retrieve product information based on the id supplied in the formal argument
    Product getProduct = productDao.getProduct(id);
    if ( getProduct == null )
        throw new IllegalArgumentException("Product not found for id: " + id);
    ProductType productType = getProduct.asProductType();
    return productType;
}