DTO (data transfer object) is an object that carries data between processes. DTOs for JPA entities generally contain a subset of entity attributes. For example, if you need to expose only a few of the entity attributes via REST API, you can map entities to DTOs with those attributes and serialize only them. Basically, DTOs allow you to decouple presentation/business logic layer from the data access layer.
JPA Buddy offers DTO generation from JPA entities via a visual designer:
By default, JPA Buddy generates immutable DTOs – all the fields are final, and there are no setters for them. To generate DTOs with simple private fields, setters for them, and no-args constructor, check the "Mutable" box.
Entities can reference other entities via associations, and JPA Buddy allows you to generate DTOs for the referenced entities from the same window. Just check the referenced entity in the tree, choose the DTO type and pick the required fields. Let’s look at the available DTO types.
A new class will be created in a separate file. You can specify the package and name for it.
A new public static nested class will be created.
You can select a DTO class that already exists in the project. After clicking on the Browse button, a window with two tabs will open.
On the "Search by Name" tab, you can find classes using keyword search.
On the "Project" tab, you can view the project tree and find the desired class.
This type can be applied for @
ToOne associations and @
ToMany associations with only one selected field.
For Flat DTOs, all inner class fields will be top-class fields. Their names will consist of the inner class filed name + fields names.
For the configuration specified above, the following fields will be generated:
private String name;
private LocalDate birthDate;
private String ownerFirstName;
private String ownerLastName;
If you use SDK version 16 and higher in your project, then JPA Buddy will provide an additional "Java Record" checkbox in the "New DTO" wizard. To check the SDK version of the project, open File -> Project Structure...
MapStruct is a code generator that greatly simplifies the implementation of mappings. The "Mapper class" field appears in the "New DTO" window if your project contains the corresponding dependency. You can select an existing Mapper or create a new one.
Also, JPA Buddy can help if you prefer to have a single big mapper interface with methods for all entities. In this case, use IntelliJ IDEA "Generate Menu" (Cmd+N/Alt+Insert) in the open mapper class and create methods for any entity.
Each project may follow its own conventions for code writing. In the Tools -> JPA Buddy -> DTO Declaration you can configure:
(?<entity>.*)
pattern. So, if the regexp is defined as A DTO for the{@link (?.*)} entity.
it will be resolved in the following comment: //A DTO for the {@link io.jpabuddy.demo.entities.Project} entity.
. The feature is disabled when the field is empty.(?<entity>.)
pattern. E.g., (?.)Dto
means that the MyEntityDto
class will be considered as a DTO for MyEntity
. The feature is disabled when the field is empty.As soon as JPA Buddy is able to associate DTO class with the entity: