Pregunta

Tengo un objeto de productos que pertenece a ciertas categorías, es decir, relación clásica de muchos a uno.

@Entity
public class Product{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    String name;
    Double price;
    @ManyToOne(fetch = FetchType.LAZY)
    Category category;
...
}

@Entity
public class Category implements Identifiable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
...
}

Deseo insertar y actualizar productos sin preseleccionar categorías. Así:

Product product = dao.get(productId);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.update(product);

o

Product product = new Product(somename);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.insert(product);

¿Es posible actualizar e insertar sin seleccionar una categoría? No quiero usar HQL o consultas directas para eso.

¿Fue útil?

Solución

session.load () existe específicamente para casos como este. Lo siguiente:

Category category = session.load(categoryId);
product.setCategory(category);

no golpeará la base de datos. Sin embargo, arrojará una excepción en una etapa posterior (durante la descarga, más o menos) si no hay una categoría disponible con la identificación dada.

Usar load () es más rápido que merge () y no tiene efectos secundarios (en cascada, etc.)

Otros consejos

Hibernate necesita una forma segura de determinar el estado de su objeto. Es por eso que es muy importante asegurarse de que no puede mezclar objetos de diferentes sesiones (por lo que no puede cargar las categorías al inicio y luego usarlas más tarde).

La solución es cargar las categorías al inicio, configurar un proveedor de almacenamiento en caché como ehcache para esta clase y luego usar este código:

Product product = new Product(somename);
product.setCategory(session.merge(category));

Eso no causará ningún viaje de ida y vuelta a la base de datos si configura el caché que las instancias de categoría no pueden cambiar.

Acabo de intentar lo siguiente:

Category category = new Category(categoryId);
product.setCategory(category);

Y funcionó, quiero decir que el registro del producto en db obtuvo el enlace correcto a la categoría y categoría con id

categoryId

no ha cambiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top