Question

J'ai des objets de produits qui appartiennent à certaines catégories, c'est-à-dire classiques plusieurs à une relation.

@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;
...
}

Je souhaite insérer et mettre à jour des produits sans présélectionner des catégories. Comme ceci:

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

ou

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

Est-il possible de mettre à jour et d'insérer sans sélection de catégorie? Je ne veux pas utiliser HQL ou des requêtes directes pour cela.

Était-ce utile?

La solution

session.load () existe spécifiquement pour des cas comme celui-ci. Les éléments suivants:

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

ne touchera pas la base de données. Cependant, une exception sera lancée à un stade ultérieur (au cours de la séquence, plus ou moins) si aucune catégorie n’est disponible avec un identifiant donné.

L'utilisation de load () est plus rapide que merge () et n'a aucun effet secondaire (en cascade, etc ...)

Autres conseils

Hibernate a besoin d’un moyen sûr de déterminer l’état de votre objet. C’est pourquoi il est difficile de ne pas mélanger des objets de différentes sessions (vous ne pouvez donc pas charger les catégories au démarrage, puis les utiliser plus tard).

La solution consiste à charger les catégories au démarrage, à configurer un fournisseur de mise en cache tel que ehcache pour cette classe, puis à utiliser ce code:

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

Cela ne causera pas d'allers-retours dans la base de données si vous configurez le cache que les instances de catégorie ne peuvent pas changer.

Je viens d'essayer de suivre:

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

Et cela a fonctionné, je veux dire l'enregistrement de produit dans la base de données a obtenu un lien correct vers la catégorie et la catégorie avec l'identifiant

categoryId

n'a pas changé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top