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.

War es hilfreich?

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

got
categoryId

haben sich nicht geändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top