Hibernate, d'insérer ou de mettre à jour, sans sélectionner
J'ai un produits objets qui appartiennent à certaines catégories classique, c'est à dire beaucoup pour 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 veux insérer et mettre à jour les produits sans présélectionnant 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 de les insérer sans catégorie de la sélection? Je ne veux pas utiliser les requêtes HQL ou de diriger les requêtes pour cet.
OriginalL'auteur Vladimir | 2009-11-30
Vous devez vous connecter pour publier un commentaire.
session.load() existe spécifiquement pour les cas comme cela. Suivantes:
n'affecteront pas la base de données. Cependant, il lève une exception à un stade ultérieur (pendant le rinçage, plus ou moins) si il n'y a pas de catégorie disponible avec l'id donné.
À l'aide de
load()
est plus rapide quemerge()
et n'a pas d'effets secondaires (en cascade, etc...)OriginalL'auteur ChssPly76
Hibernate a besoin d'un moyen sûr de déterminer l'état de votre objet. C'est pourquoi il va un long chemin à assurez-vous que vous ne pouvez pas mélanger des objets de différentes sessions (si vous ne pouvez pas charger les catégories au démarrage et ensuite il suffit de les utiliser plus tard).
La solution est de charger les catégories au démarrage, mettre en place un cache fournisseur comme
ehcache
de cette classe et ensuite utiliser ce code:Qui ne causera pas de DB allers-retours si vous configurez le cache de la catégorie des instances ne peuvent pas changer.
OriginalL'auteur Aaron Digulla
J'ai juste essayé suivantes:
Et cela a fonctionné, je veux dire l'enregistrement de produit en db correctes lien vers la catégorie et la catégorie avec l'id
n'ont pas changé.
Category
en question n'a pas été associée avec actuelle session; si elle l'était, Hibernate permettrait de lever une exception. Il est également dangereux en termes d'intégrité des données; si vous spécifiez en cascade pour votre plusieurs-à-un surcategory
, le code ci-dessus serait de remplacer votre catégorie d'origine avec toutes les valeurs vides (ou échouer avec l'erreur de violation de contrainte)Hm, j'ai eu un sentiment que je suis en train de faire quelque chose de méchant ici. Merci pour la clarification.
OriginalL'auteur Vladimir