JPA con Hibernate en JHipster findOne no retorna la entidad aunque sí existe.

Hola Comunidad!

Bueno actualmente me encuentro desarrollando un sistema con jhipster, esta es la versión del generador como la de hibernate.

"generator-jhipster": "4.6.0",
Hiberante 5.2.8.Final.

El caso es el siguiente, entro a una vista (e.j. http://localhost//mientidad/{id}) la cual funciona para editar datos de dicho objeto, supongamos que solo presiono el botón actualizar y la entidad se persiste si ningún problema, pero si presiono F5 , la vista ya no consulta y me devuelve null el objeto cuyo id si existe. En resumen este problema se presenta solo después de guardar. Si no recargo la vista y sigo navegando y luego vuelvo a entrar y presiono F5 sin guardar lo carga bien, así que supongo que tiene que ver con el guardar. Creo pensar que es algo de Hibernate.

Resource.java

@GetMapping("/orders/{id}")
    @Timed
    public ResponseEntity<OrderDTO> getOrder(@PathVariable Long id) {
        log.debug("REST request to get Order : {}", id);
        OrderDTO orderDTO = orderService.findOne(id);
        return ResponseUtil.wrapOrNotFound(Optional.ofNullable(orderDTO));
    }

Service.java

@Service
@Transactional
public class ServiceImpl implements Service{

@Override
    public OrderDTO save(OrderDTO orderDTO) {
        log.debug("Request to save Order : {}", orderDTO);
        Order order = orderRepository.saveAndFlush(orderMapper.toEntity(orderDTO));

        Set<ProductOrder> productOrders = orderDTO.getProductOrders().stream().map(p ->{
            p.setProductsOrderId(order.getId());
            p.setProductsOrderVersion(order.getVersion());
            return productOrderMapper.toEntity(p);
        }).collect(Collectors.toSet());

        productOrderRepository.save(productOrders);
        productOrderRepository.flush();

        order.setProductOrders(productOrders);
        return orderMapper.toDto(order);
    }
}

Entity

package com.xxx;

//imports

/**
 * Entity
 */

@ApiModel(description = "Entity")
@Entity
@Table(name = "jhi_order")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Entity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "jhi_date", nullable = false)
    private ZonedDateTime date;

    @Column(name = "last_updated")
    private ZonedDateTime lastUpdated;

    @Version
    private Long version;

    @NotNull
    @Size(max = 50)
    @Column(name = "folio", length = 50, nullable = false, unique = true)
    private String folio;

    @NotNull
    @Column(name = "total_before_tax", precision=10, scale=2, nullable = false)
    private BigDecimal totalBeforeTax;

    @NotNull
    @Column(name = "tax", precision=10, scale=2, nullable = false)
    private BigDecimal tax;

    @NotNull
    @Column(name = "total_after_tax", precision=10, scale=2, nullable = false)
    private BigDecimal totalAfterTax;

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false)
    private OrderStatus status;

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(name = "jhi_type", nullable = false)
    private TypeOrder type;

    @OneToMany(mappedBy = "productsOrder")
    private Set<ProductOrder> productOrders = new HashSet<>();

    @ManyToOne(optional = false)
    @NotNull
    private Supplier supplier;

    @ManyToOne(optional = false)
    @NotNull
    private User userRequest;

    @ManyToOne
    private Order origenOrder;

   //Getters and setters

Ya le he dado muchas vueltas y no encuentro que pueda ser, yo digo que es algo de hibernate, pues que el id si existe.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Para que utilizas la

Para que utilizas la siguiente anotación en tu entity?

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

No veo necesario que hagas flush cada vez que salvas.

Imagen de Hizmarck

configuración de jhipster

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) es la configuración que me generó por defecto el jhipster, inclusive eliminé dichas anotaciones y me causo más problemas, pues intentaba entrar a la vista de cualquier entidad y respondía con not found, pudiendo ser algo de la cache y la sessión de hibernate (eso estoy leyendo).

Respecto a los flush despúes de guardar cada entidad es por que uso @Version como bloqueo optimista y si no se los paso a los productos me marca error.

Imagen de Hizmarck

Resuelto

@javadicto Gracias a tus preguntas revise más a detalle la clase, y pude resolver el problema, todo se resumen en esto:

@ManyToOne (optional = false)
     private Order originOrder;

@ManyToOne (optional = false)
     private WhareHouse deliveryLocation;

En mi modelo de negocio originOrder y deliveryLocation pueden ser nulos, solo con cambiarlos:

@ManyToOne (optional = true)
     private Order originOrder;

@ManyToOne (optional = true)
     private WhareHouse deliveryLocation;

Todo funciona ahora correctamente, fue muy extraño el que eso generó inestabilidad solo al guardar.

saludos y gracias.

Nunca he usado jhipster en

Nunca he usado jhipster en forma, pero ese tipo de herramientas suelen generar mucho codigo basura, anotaciones y configuraciones desconocidas para la mayoria.

Suelo usar ese tipo de herramientas para armar el cascaron o para conocer nuevos frameworks, librerias, etc; pero jamas las uso para desarrollar una aplicación productiva, simplemente por el mismo desconocimiento de toda la integración entre componentes que realiza.