Hibernate, einfügen oder aktualisieren, ohne wählen
Frage
Ich habe einen Artikel Objekte, die das heißt klassisch eine Beziehung vieler auf bestimmte Gruppen gehören.
@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;
...
}
Ich möchte einfügen und aktualisieren Produkte ohne Kategorien Vorwählen. Wie folgt aus:
Product product = dao.get(productId);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.update(product);
oder
Product product = new Product(somename);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.insert(product);
Ist es möglich, ohne Kategorie Auswahl zu aktualisieren und einfügen? Ich möchte nicht für die HQL oder direkte Anfragen verwenden.
Lösung
session.load () existiert speziell für Fälle wie diesen. In dem folgenden:
Category category = session.load(categoryId);
product.setCategory(category);
wird die Datenbank nicht getroffen. Es wird jedoch eine Ausnahme zu einem späteren Zeitpunkt werfen (während des Flush, mehr oder weniger), wenn es keine Kategorie mit angegebener ID verfügbar ist.
load()
Verwendung ist schneller als merge()
und hat keine Nebenwirkungen (Kaskadierung, etc ...)
Andere Tipps
Ruhezustand braucht einen sicheren Weg, um den Zustand des Objekts zu bestimmen. Deshalb ist es ein langer Weg zu gehen, um sicherzustellen, dass Sie keine Objekte aus verschiedenen Sitzungen mischen können (so dass Sie nicht die Kategorien beim Start laden und sie dann benutzen Sie einfach später).
Die Lösung ist die Kategorien beim Start zu laden, einen Caching-Provider wie ehcache
für diese Klasse und verwenden Sie dann diesen Code ein:
Product product = new Product(somename);
product.setCategory(session.merge(category));
Das wird nicht dazu führen, keine DB Umläufe, wenn Sie den Cache, die Kategorie Instanzen so konfiguriert, können nicht geändert werden.
Ich habe gerade versucht, folgende:
Category category = new Category(categoryId);
product.setCategory(category);
Und es hat funktioniert, ich meinen Produktdatensatz in db richtigen Link zur Kategorie und die Kategorie mit der ID
gotcategoryId
haben sich nicht geändert.