Что такое Hibernate-эквивалент JDO makeTransient - PullRequest
0 голосов
/ 27 января 2011

Я портирую слой Dao из KodoJDO в Hibernate. Я храню свои меню в базе данных и, основываясь на правах пользователя, сокращаю локальную копию, чтобы отобразить только то, что пользователю разрешено делать.

Когда я делал это в KodoJDO, мне нужно было сделать объект, который я обрезал, переходным, потому что я не хотел записывать изменения обратно в БД.

Я не вижу эквивалентной функции в Hibernate. Есть один? Как я могу сохранить эти изменения от записи обратно в БД.

Вот функция обрезки.

 public void prune(Collection<Entitlement> ents)
 {
  Session session=PersistenceManager.getManager();
  // Rewrite----------------------------------
  //session.makeTransient(this);

  for (Iterator<Leaf> iter = leafs.iterator(); iter.hasNext();)
  {
   Leaf l = (Leaf) iter.next();
   if(!l.isAllowed(ents))
   {
    iter.remove();
   }
  }
  for (Iterator<Branch> iter = branches.iterator(); iter.hasNext();)
  {
   Branch b = (Branch) iter.next();
   if(b!= this)
   {
    b.prune(ents);
   }
   if (b.hasNoChildren())
   {
    iter.remove();
   }
  }
 }

Комментарий к ответам. Я принял тот, который был наиболее полным, но ответы Скаффмана и Аффе также были ценными.

Ответы [ 3 ]

2 голосов
/ 27 января 2011

evict(Object object) - это метод интерфейса Session, который вы ищете.

Также обратите внимание, что словарь немного отличается в спящем режиме.Согласно сессионному javadoc:

transient: never persistent, not associated with any Session
persistent: associated with a unique Session
detached: previously persistent, not associated with any Session

Так что переходный процесс не означает совсем то же самое.«Отдельно» - это слово, которое они используют для того, о чем вы говорите.

1 голос
/ 27 января 2011

В JPA 2.0 это entityManager.detach(..). Я явно даю версию JPA, потому что рекомендуется использовать спящий режим через JPA.

Если мы посмотрим, как метод detach(..) реализован в EntityManagerImpl в hibernate, он использует getSession().evict(entity) в базовом сеансе

Но учтите, что вам редко нужно это делать. Я не знаю, является ли это обычной практикой в ​​JDO, но в JPA / Hibernate она не нужна, если вы используете их правильно.

Согласно вашему комментарию - если вы хотите использовать спящие сущности в качестве объектов, значения которых вы изменяете, но не сохраняете. Я не использовал их таким образом, потому что у меня обычно нет открытого менеджера сессий / сущностей в моем представлении. Или я использую объекты значения. Если у вас обоих открыт сеанс в представлении, и у вас нет объектов-значений - да, это допустимое использование.

0 голосов
/ 27 января 2011

Session.evict(entity) вероятно имеет семантику , которую вы ищете:

Удалить этот экземпляр из кэша сеанса. Изменения в экземпляре не будут синхронизированы с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...