Hibernate, вставить или обновить без выбора - PullRequest
10 голосов
/ 30 ноября 2009

У меня есть объекты товаров, которые относятся к определенным категориям, т.е.

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

Я хочу вставлять и обновлять продукты без предварительного выбора категорий. Как это:

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

или

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

Можно ли обновлять и вставлять без выбора категории? Я не хочу использовать HQL или прямые запросы для этого.

Ответы [ 3 ]

10 голосов
/ 30 ноября 2009

session.load () существует специально для подобных случаев. Следующее:

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

не попадет в базу данных. Однако на более позднем этапе (если во время сброса, более или менее) будет сгенерировано исключение, если для данного идентификатора нет категории.

Использование load() быстрее, чем merge() и не имеет побочных эффектов (каскадирование и т. Д.) *

2 голосов
/ 30 ноября 2009

Hibernate нуждается в безопасном способе определения состояния вашего объекта. Вот почему очень важно убедиться, что вы не можете смешивать объекты из разных сеансов (поэтому вы не можете загружать категории при запуске, а затем просто использовать их позже).

Решение состоит в том, чтобы загрузить категории при запуске, настроить поставщика кэширования, например ehcache, для этого класса и затем использовать этот код:

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

Это не вызовет каких-либо обращений к БД, если вы сконфигурируете кеш, который экземпляры категорий не могут изменить.

0 голосов
/ 01 декабря 2009

Я только что попробовал следующее:

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

И это сработало, я имею в виду, запись продукта в дБ получила правильную ссылку на категорию и категорию с идентификатором

categoryId

не изменились.

...