Reputation: 1
I'm having problems with mapping entity relationships using Model Mapper and Spring Boot. The code is below (sorry, the attribute names are in Portuguese):
EquipamentoMarca.java
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table( name = "equipamento_marca" )
public class EquipamentoMarca {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column( name = "marca" )
private String marca;
@JsonFormat( pattern = "dd/MM/yyyy HH:mm" )
@Column( name = "data_cadastro" )
private Date dataCadastro;
// -----
@OneToMany( mappedBy = "marca", cascade = CascadeType.ALL, orphanRemoval = true )
private Set<EquipamentoModelomodelos = new HashSet<>();
// -----
@PrePersist
public void prePersist() {
Date now = new Date();
setDataCadastro( now );
}
}
EquipamentoModelo.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table( name = "equipamento_modelo" )
public class EquipamentoModelo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@Column( name = "modelo" )
private String modelo;
@JsonFormat( pattern = "dd/MM/yyyy HH:mm" )
@Column( name = "data_cadastro" )
private Date dataCadastro;
// -----
@ManyToOne( fetch = FetchType.LAZY )
@JoinColumn( name="marca_id" )
private EquipamentoMarca marca;
// -----
@PrePersist
public void prePersist() {
Date now = new Date();
setDataCadastro( now );
}
}
EquipamentoMarcaDto.java
@Data
public class EquipamentoMarcaDto {
private long id;
private String marca;
private Date dataCadastro;
private Set<EquipamentoModeloDtomodelos;
}
EquipamentoModeloDto.java
@Data
public class EquipamentoModeloDto {
private long id;
private String modelo;
private Date dataCadastro;
}
EquipamentoMarcaResponse.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EquipamentoMarcaResponse {
private List<EquipamentoMarcaDtocontent;
private int pageNo;
private int pageSize;
private long totalElements;
private int totalPages;
private boolean last;
}
EquipamentoModeloResponse.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EquipamentoModeloResponse {
private List<EquipamentoModeloDtocontent;
private int pageNo;
private int pageSize;
private long totalElements;
private int totalPages;
private boolean last;
}
EquipamentoMarcaRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
public interface EquipamentoMarcaRepository extends JpaRepository<EquipamentoMarca, Long>{
}
**EquipamentoModeloRepository.java**
import org.springframework.data.jpa.repository.JpaRepository;
public interface EquipamentoModeloRepository extends JpaRepository<EquipamentoModelo, Long>{
List<EquipamentoModelofindByMarcaId( long equipamentoMarcaId );
}
EquipamentoMarcaService.java
public interface EquipamentoMarcaService {
EquipamentoMarcaDto createEquipamentoMarca( EquipamentoMarcaDto equipamentoMarcaDto );
EquipamentoMarcaResponse getAllEquipamentosMarcas( int pageNo, int pageSize, String sortBy, String sortDir );
EquipamentoMarcaDto getEquipamentoMarcaById( long id );
EquipamentoMarcaDto updateEquipamentoMarca( EquipamentoMarcaDto equipamentoMarcaDto, long id );
void deleteEquipamentoMarcaById( long id );
}
EquipamentoModeloService.java
public interface EquipamentoModeloService {
EquipamentoModeloDto createEquipamentoModelo( long equipamentoMarcaId, EquipamentoModeloDto equipamentoModeloDto );
EquipamentoModeloResponse getAllEquipamentosModelos( int pageNo, int pageSize, String sortBy, String sortDir );
List<EquipamentoModeloDtogetEquipamentosModelosByEquipamentoMarcaId( long equipamentoMarcaId );
EquipamentoModeloDto getEquipamentoModeloById( Long equipamentoMarcaId, Long equipamentoModeloId );
EquipamentoModeloDto updateEquipamentoModelo( Long equipamentoMarcaId, long equipamentoModeloId, EquipamentoModeloDto equipamentoModeloRequest );
void deleteEquipamentoModelo( Long equipamentoMarcaId, Long equipamentoModeloId );
}
EquipamentoMarcaServiceImpl.java
@Service
public class EquipamentoMarcaServiceImpl implements EquipamentoMarcaService{
private EquipamentoMarcaRepository equipamentoMarcaRepository;
private ModelMapper mapper;
// -----
public EquipamentoMarcaServiceImpl(EquipamentoMarcaRepository equipamentoMarcaRepository, ModelMapper mapper) {
this.equipamentoMarcaRepository = equipamentoMarcaRepository;
this.mapper = mapper;
}
// -----
@Override
public EquipamentoMarcaDto createEquipamentoMarca( EquipamentoMarcaDto equipamentoMarcaDto ) {
//Convert DTO to Entity
EquipamentoMarca equipamentoMarca = mapToEntity( equipamentoMarcaDto );
EquipamentoMarca newEquipamentoMarca = equipamentoMarcaRepository.save( equipamentoMarca );
//Convert Entity to DTO
EquipamentoMarcaDto equipamentoMarcaResponse = mapToDto(newEquipamentoMarca);
return equipamentoMarcaResponse;
}
@Override
public EquipamentoMarcaResponse getAllEquipamentosMarcas( int pageNo, int pageSize, String sortBy, String sortDir ) {
Sort sort = sortDir.equalsIgnoreCase( Sort.Direction.ASC.name() ) ? Sort.by( sortBy ).ascending()
Sort.by( sortBy ).descending();
Pageable pageable = PageRequest.of( pageNo, pageSize, sort );
Page<EquipamentoMarcaequipamentoMarcas = equipamentoMarcaRepository.findAll( pageable );
List<EquipamentoMarcalistOfEquipamentoMarcas = equipamentoMarcas.getContent();
List<EquipamentoMarcaDtocontent = listOfEquipamentoMarcas.stream().map( equipamentoMarca -> mapToDto( equipamentoMarca )).collect( Collectors.toList() );
EquipamentoMarcaResponse equipamentoMarcaResponse = new EquipamentoMarcaResponse();
equipamentoMarcaResponse.setContent(content);
equipamentoMarcaResponse.setPageNo(equipamentoMarcas.getNumber());
equipamentoMarcaResponse.setPageSize(equipamentoMarcas.getSize());
equipamentoMarcaResponse.setTotalElements(equipamentoMarcas.getTotalElements());
equipamentoMarcaResponse.setTotalPages(equipamentoMarcas.getTotalPages());
equipamentoMarcaResponse.setLast(equipamentoMarcas.isLast());
return equipamentoMarcaResponse;
}
@Override
public EquipamentoMarcaDto getEquipamentoMarcaById(long id) {
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById(id).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", id ) );
return mapToDto( equipamentoMarca );
}
@Override
public EquipamentoMarcaDto updateEquipamentoMarca(EquipamentoMarcaDto equipamentoMarcaDto, long id) {
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById(id).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", id ) );
equipamentoMarca.setMarca( equipamentoMarcaDto.getMarca() );
equipamentoMarca.setDataCadastro( equipamentoMarcaDto.getDataCadastro() );
EquipamentoMarca updatedEquipamentoMarca = equipamentoMarcaRepository.save(equipamentoMarca);
return mapToDto(updatedEquipamentoMarca);
}
@Override
public void deleteEquipamentoMarcaById(long id) {
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById(id).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", id ) );
equipamentoMarcaRepository.delete( equipamentoMarca );
}
// -----
//Convert DTO to Entity
private EquipamentoMarca mapToEntity(EquipamentoMarcaDto equipamentoMarcaDto) {
/*
EquipamentoMarca equipamentoMarca = new EquipamentoMarca();
equipamentoMarca.setMarca(equipamentoMarcaDto.getMarca());
equipamentoMarca.setDataCadastro(equipamentoMarcaDto.getDataCadastro());
*/
EquipamentoMarca equipamentoMarca = mapper.map(equipamentoMarcaDto, EquipamentoMarca.class);
return equipamentoMarca;
}
//Convert Entity to DTO
private EquipamentoMarcaDto mapToDto( EquipamentoMarca equipamentoMarca ) {
/*
EquipamentoMarcaDto equipamentoMarcaDto = new EquipamentoMarcaDto();
equipamentoMarcaDto.setId(equipamentoMarca.getId());
equipamentoMarcaDto.setMarca(equipamentoMarca.getMarca());
equipamentoMarcaDto.setDataCadastro(equipamentoMarca.getDataCadastro());
*/
EquipamentoMarcaDto equipamentoMarcaDto = mapper.map( equipamentoMarca, EquipamentoMarcaDto.class );
return equipamentoMarcaDto;
}
}
EquipamentoModeloServiceImpl.java
@Service
public class EquipamentoModeloServiceImpl implements EquipamentoModeloService {
private EquipamentoModeloRepository equipamentoModeloRepository;
private EquipamentoMarcaRepository equipamentoMarcaRepository;
private ModelMapper mapper;
// -----
public EquipamentoModeloServiceImpl(EquipamentoModeloRepository equipamentoModeloRepository,
EquipamentoMarcaRepository equipamentoMarcaRepository, ModelMapper mapper) {
this.equipamentoModeloRepository = equipamentoModeloRepository;
this.equipamentoMarcaRepository = equipamentoMarcaRepository;
this.mapper = mapper;
}
// -----
@Override
public EquipamentoModeloDto createEquipamentoModelo(long equipamentoMarcaId,EquipamentoModeloDto equipamentoModeloDto) {
EquipamentoModelo equipamentoModelo = mapToEntity( equipamentoModeloDto );
//retrieve a equipament brand by id
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById( equipamentoMarcaId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", equipamentoMarcaId ) );
equipamentoModelo.setMarca( equipamentoMarca );
EquipamentoModelo newEquipamentoModelo = equipamentoModeloRepository.save( equipamentoModelo );
return mapToDto(newEquipamentoModelo);
}
@Override
public EquipamentoModeloResponse getAllEquipamentosModelos( int pageNo, int pageSize, String sortBy, String sortDir ) {
Sort sort = sortDir.equalsIgnoreCase( Sort.Direction.ASC.name() ) ? Sort.by( sortBy ).ascending()
Sort.by( sortBy ).descending();
Pageable pageable = PageRequest.of( pageNo, pageSize, sort );
Page<EquipamentoModeloequipamentoModelos = equipamentoModeloRepository.findAll( pageable );
List<EquipamentoModelolistOfEquipamentoModelos = equipamentoModelos.getContent();
List<EquipamentoModeloDtocontent = listOfEquipamentoModelos.stream().map( equipamentoModelo -> mapToDto( equipamentoModelo )).collect( Collectors.toList() );
EquipamentoModeloResponse equipamentoModeloResponse = new EquipamentoModeloResponse();
equipamentoModeloResponse.setContent(content);
equipamentoModeloResponse.setPageNo(equipamentoModelos.getNumber());
equipamentoModeloResponse.setPageSize(equipamentoModelos.getSize());
equipamentoModeloResponse.setTotalElements(equipamentoModelos.getTotalElements());
equipamentoModeloResponse.setTotalPages(equipamentoModelos.getTotalPages());
equipamentoModeloResponse.setLast(equipamentoModelos.isLast());
return equipamentoModeloResponse;
}
@Override
public List<EquipamentoModeloDtogetEquipamentosModelosByEquipamentoMarcaId ( long equipamentoMarcaId ) {
//retrieve an equipament model
List<EquipamentoModeloequipamentosModelos = equipamentoModeloRepository.findByMarcaId ( equipamentoMarcaId );
//convert list of equipament model to list of equipament model dto
return equipamentosModelos.stream().map( equipamentoModelo -> mapToDto( equipamentoModelo ) ).collect( Collectors.toList() );
}
@Override
public EquipamentoModeloDto getEquipamentoModeloById(Long equipamentoMarcaId, Long equipamentoModeloId) {
//retrieve a equipament brand by id
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById( equipamentoMarcaId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", equipamentoMarcaId ) );
//retrieve a equipament model by id
EquipamentoModelo equipamentoModelo = equipamentoModeloRepository.findById( equipamentoModeloId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoModelo", "id", equipamentoModeloId ) );
if( !equipamentoModelo.getMarca().getId().equals(equipamentoMarca.getId()) ) {
throw new SecaoDeMaterialBelicoAPIException( HttpStatus.BAD_REQUEST, "Modelo não pertence à marca" );
}
return mapToDto( equipamentoModelo );
}
@Override
public EquipamentoModeloDto updateEquipamentoModelo(Long equipamentoMarcaId, long equipamentoModeloId,
EquipamentoModeloDto equipamentoModeloRequest) {
//retrieve a equipament brand by id
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById( equipamentoMarcaId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", equipamentoMarcaId ) );
//retrieve a equipament model by id
EquipamentoModelo equipamentoModelo = equipamentoModeloRepository.findById( equipamentoModeloId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoModelo", "id", equipamentoModeloId ) );
if( !equipamentoModelo.getMarca().getId().equals(equipamentoMarca.getId()) ) {
throw new SecaoDeMaterialBelicoAPIException( HttpStatus.BAD_REQUEST, "Modelo não pertence à marca" );
}
equipamentoModelo.setModelo( equipamentoModeloRequest.getModelo() );
equipamentoModelo.setDataCadastro( equipamentoModeloRequest.getDataCadastro() );
EquipamentoModelo updatedEquipamentoModelo = equipamentoModeloRepository.save( equipamentoModelo );
return mapToDto(updatedEquipamentoModelo);
}
@Override
public void deleteEquipamentoModelo(Long equipamentoMarcaId, Long equipamentoModeloId) {
//retrieve a equipament brand by id
EquipamentoMarca equipamentoMarca = equipamentoMarcaRepository.findById( equipamentoMarcaId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoMarca", "id", equipamentoMarcaId ) );
//retrieve a equipament model by id
EquipamentoModelo equipamentoModelo = equipamentoModeloRepository.findById( equipamentoModeloId ).orElseThrow( () -> new ResourceNotFoundException( "EquipamentoModelo", "id", equipamentoModeloId ) );
if( !equipamentoModelo.getMarca().getId().equals(equipamentoMarca.getId()) ) {
throw new SecaoDeMaterialBelicoAPIException( HttpStatus.BAD_REQUEST, "Modelo não pertence à marca" );
}
equipamentoModeloRepository.delete(equipamentoModelo);
}
//Convert DTO to Entity
private EquipamentoModelo mapToEntity( EquipamentoModeloDto equipamentoModeloDto ) {
/*
EquipamentoModelo equipamentoModelo = new EquipamentoModelo();
equipamentoModelo.setId(equipamentoModeloDto.getId());
equipamentoModelo.setModelo(equipamentoModeloDto.getModelo());
equipamentoModelo.setDataCadastro(equipamentoModeloDto.getDataCadastro());
*/
EquipamentoModelo equipamentoModelo = mapper.map( equipamentoModeloDto, EquipamentoModelo.class );
return equipamentoModelo;
}
//Convert Entity to DTO
private EquipamentoModeloDto mapToDto( EquipamentoModelo equipamentoModelo ) {
/*
EquipamentoModeloDto equipamentoModeloDto = new EquipamentoModeloDto();
equipamentoModeloDto.setId(equipamentoModelo.getId());
equipamentoModeloDto.setModelo(equipamentoModelo.getModelo());
equipamentoModeloDto.setDataCadastro(equipamentoModelo.getDataCadastro());
*/
EquipamentoModeloDto equipamentoModeloDto = mapper.map( equipamentoModelo, EquipamentoModeloDto.class );
return equipamentoModeloDto;
}
EquipamentoMarcaController.java
@RestController
@RequestMapping("/api/equipamentos-marcas")
public class EquipamentoMarcaController {
private EquipamentoMarcaService equipamentoMarcaService;
// -----
public EquipamentoMarcaController(EquipamentoMarcaService equipamentoMarcaService) {
this.equipamentoMarcaService = equipamentoMarcaService;
}
// -----
@PostMapping
public ResponseEntity<EquipamentoMarcaDtocreateEquipamentoMarca( @RequestBody EquipamentoMarcaDto equipamentoMarcaDto ) {
return new ResponseEntity<>( equipamentoMarcaService.createEquipamentoMarca( equipamentoMarcaDto ), HttpStatus.CREATED );
}
@GetMapping
public EquipamentoMarcaResponse gettAllEquipamentoMarcas(
@RequestParam( value = "pageNo", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER, required = false ) int pageNo,
@RequestParam( value = "pageSize", defaultValue = AppConstants.DEFAULT_PAGE_SIZE, required = false ) int pageSize,
@RequestParam( value = "sortBy", defaultValue = AppConstants.DEFAULT_SORT_BY, required = false ) String sortBy,
@RequestParam( value = "sortDir", defaultValue = AppConstants.DEFAULT_SORT_DIRECTION, required = false ) String sortDir
) {
return equipamentoMarcaService.getAllEquipamentosMarcas( pageNo, pageSize, sortBy, sortDir );
}
@GetMapping("/{id}")
public ResponseEntity<EquipamentoMarcaDtogetEquipamentoMarcaById( @PathVariable( name="id" ) long id) {
return ResponseEntity.ok( equipamentoMarcaService.getEquipamentoMarcaById(id) );
}
@PutMapping("/{id}")
public ResponseEntity<EquipamentoMarcaDtoupdateEquipamentoMarca( @RequestBody EquipamentoMarcaDto equipamentoMarcaDto, @PathVariable(name = "id") long id ) {
EquipamentoMarcaDto equipamentoMarcaResponse = equipamentoMarcaService.updateEquipamentoMarca( equipamentoMarcaDto, id );
return new ResponseEntity<>( equipamentoMarcaResponse, HttpStatus.OK );
}
@DeleteMapping("/{id}")
public ResponseEntity<StringdeleteEquipamentoMarca( @PathVariable( name = "id" ) long id ) {
equipamentoMarcaService.deleteEquipamentoMarcaById(id);
return new ResponseEntity<>( "Marca de equipamento deletada com sucesso.", HttpStatus.OK );
}
}
EquipamentoModeloController.java
@RestController
@RequestMapping("/api/")
public class EquipamentoModeloController {
private EquipamentoModeloService equipamentoModeloService;
// -----
public EquipamentoModeloController(EquipamentoModeloService equipamentoModeloService) {
this.equipamentoModeloService = equipamentoModeloService;
}
// -----
@PostMapping("/equipamentos-modelos")
public ResponseEntity<EquipamentoModeloDtocreateEquipamentoModelo( @PathVariable( value="equipamentoMarcaId" ) long equipamentoMarcaId, @RequestBody EquipamentoModeloDto equipamentoModeloDto) {
return new ResponseEntity<>( equipamentoModeloService.createEquipamentoModelo( equipamentoMarcaId, equipamentoModeloDto ), HttpStatus.CREATED );
}
@GetMapping("/equipamentos-modelos")
public EquipamentoModeloResponse gettAllEquipamentoMarcas(
@RequestParam( value = "pageNo", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER, required = false ) int pageNo,
@RequestParam( value = "pageSize", defaultValue = AppConstants.DEFAULT_PAGE_SIZE, required = false ) int pageSize,
@RequestParam( value = "sortBy", defaultValue = AppConstants.DEFAULT_SORT_BY, required = false ) String sortBy,
@RequestParam( value = "sortDir", defaultValue = AppConstants.DEFAULT_SORT_DIRECTION, required = false ) String sortDir
) {
return equipamentoModeloService.getAllEquipamentosModelos( pageNo, pageSize, sortBy, sortDir );
}
@GetMapping("/equipamentos-marcas/{equipamentoMarcaId}/equipamentos-modelos")
public List<EquipamentoModeloDtogetEquipamentosModelosByEquipamentoMarcaId( @PathVariable( value="equipamentoMarcaId" ) Long equipamentoMarcaId ){
return equipamentoModeloService.getEquipamentosModelosByEquipamentoMarcaId( equipamentoMarcaId );
}
@GetMapping("/equipamentos-marcas/{equipamentoMarcaId}/equipamentos-modelos/{id}")
public ResponseEntity<EquipamentoModeloDtogetEquipamentoModeloById( @PathVariable( value="equipamentoMarcaId" ) Long equipamentoMarcaId, @PathVariable( value="id" ) Long equipamentoModeloId ) {
EquipamentoModeloDto equipamentoModeloDto = equipamentoModeloService.getEquipamentoModeloById( equipamentoMarcaId, equipamentoModeloId );
return new ResponseEntity<>( equipamentoModeloDto, HttpStatus.OK );
}
@PutMapping("/equipamentos-marcas/{equipamentoMarcaId}/equipamentos-modelos/{id}")
public ResponseEntity<EquipamentoModeloDtoupdateEquipamentoModelo(
@PathVariable( value="equipamentoMarcaId" ) long equipamentoMarcaId,
@PathVariable( value="id" ) long equipamentoModeloId,
@RequestBody EquipamentoModeloDto equipamentoModeloDto){
EquipamentoModeloDto updatedEquipamentoModelo = equipamentoModeloService.updateEquipamentoModelo(equipamentoMarcaId, equipamentoModeloId, equipamentoModeloDto);
return new ResponseEntity<>( updatedEquipamentoModelo, HttpStatus.OK );
}
@DeleteMapping("/equipamentos-marcas/{equipamentoMarcaId}/equipamentos-modelos/{id}")
public ResponseEntity<StringdeleteEquipamentoModelo(
@PathVariable( value="equipamentoMarcaId" ) long equipamentoMarcaId,
@PathVariable( value="id" ) long equipamentoModeloId,
@RequestBody EquipamentoModeloDto equipamentoModeloDto){
equipamentoModeloService.deleteEquipamentoModelo( equipamentoMarcaId, equipamentoModeloId );
return new ResponseEntity<>( "Modelo de equipamento deletado com sucesso.", HttpStatus.OK );
}
}
Application.java
import org.modelmapper.ModelMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class PpgosecaodematerialbelicowsApplication {
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
public static void main(String[] args) {
SpringApplication.run(PpgosecaodematerialbelicowsApplication.class, args);
}
}
The error is:
"timestamp": "2024-08-29T02:14:45.215+00:00",
"status": 500,
"error": "Internal Server Error",
"trace": "org.modelmapper.MappingException: ModelMapper mapping errors:\r\n\r\n1) Converter org.modelmapper.internal.converter.MergingCollectionConverter@5c255950 failed to convert org.hibernate.collection.spi.PersistentSet to java.util.Set.\r\n\r\n1 error\r\n\tat org.modelmapper.internal.Errors.throwMappingException
...
(more code)
"message": "ModelMapper mapping errors:\r\n\r\n1) Converter org.modelmapper.internal.converter.MergingCollectionConverter@5c255950 failed to convert org.hibernate.collection.spi.PersistentSet to java.util.Set.\r\n\r\n1 error",
"path": "/api/equipamentos-marcas"
Thanks.
without the private Set<EquipamentoModeloDtomodelos; in EquipamentoMarcaDto.java it works
Upvotes: -1
Views: 84
Reputation: 1
thanks for the response.
I refactored the code for the classes below and it worked.
Apparently cyclic reference.
**EquipamentoMarca.java**
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table( name = "equipamento_marca" )
public class EquipamentoMarca implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column( name = "marca" )
private String marca;
@JsonFormat( pattern = "dd/MM/yyyy HH:mm" )
@Column( name = "data_cadastro" )
private Date dataCadastro;
// -----
@OneToMany( mappedBy = "marca", fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL )
private Set<EquipamentoModelo> modelos = new HashSet<>();
// -----
@PrePersist
public void prePersist() {
Date now = new Date();
setDataCadastro( now );
}
}
**EquipamentoModelo.java**
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table( name = "equipamento_modelo" )
public class EquipamentoModelo implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column( name = "modelo" )
private String modelo;
@JsonFormat( pattern = "dd/MM/yyyy HH:mm" )
@Column( name = "data_cadastro" )
private Date dataCadastro;
// -----
@ManyToOne( fetch = FetchType.LAZY )
@JoinColumn( name="marca_id" )
private EquipamentoMarca marca;
//@OneToMany( mappedBy = "modelo" )
//private List<Equipamento> equipamentos;
// -----
@PrePersist
public void prePersist() {
Date now = new Date();
setDataCadastro( now );
}
}
**EquipamentoMarcaDto.java**
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EquipamentoMarcaDto {
private long id;
@NotBlank
@Size( min = 1, message = "O campo marca deve ser preenchido" )
private String marca;
private Set<EquipamentoModeloDto> modelos;
}
**EquipamentoModeloDto.java**
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EquipamentoModeloDto {
private long id;
private String modelo;
}
Upvotes: 0
Reputation: 178
This occurs when model mapper tries to convert a hibernate managed Persistent set to a Set.
We can resolve this by configuring the custom ModelMapper to skip the automatic mapping of the modelos field, and then manually map and set the modelos collection in the DTO. This way, only the other fields are mapped automatically.
Updated Method,
private EquipamentoMarcaDto mapToDto(EquipamentoMarca equipamentoMarca) {
mapper.createTypeMap(EquipamentoMarca.class, EquipamentoMarcaDto.class)
.addMappings(mapper -> mapper.skip(EquipamentoMarcaDto::setModelos));
EquipamentoMarcaDto equipamentoMarcaDto = mapper.map(equipamentoMarca, EquipamentoMarcaDto.class);
Set<EquipamentoModeloDto> modelosDto = equipamentoMarca.getModelos().stream()
.map(modelo -> mapper.map(modelo, EquipamentoModeloDto.class))
.collect(Collectors.toSet());
equipamentoMarcaDto.setModelos(modelosDto);
return equipamentoMarcaDto;
}
Upvotes: 2