Hibernate игнорировать собственность при некоторых обстоятельствах - PullRequest
4 голосов
/ 01 ноября 2010

У меня есть объект домена, который содержит другой объект домена; назовите их A и B. B содержит большой двоичный объект (файл изображения), который может быть большим. До тех пор, пока я имею дело только с одним А, наличие В на А не является проблемой. Тем не менее, иногда я буду иметь дело с тысячами А, в которых перенос вокруг сгустка на Б приводит к истощению кучи. Когда я имею дело с таким большим количеством А, мне действительно все равно не нужен Б.

Есть ли какой-нибудь способ сказать Hibernate игнорировать это свойство для определенного вызова? Должен ли я просто сделать переходный B и иметь дело с обновлением / удалением вручную в этом случае?

Прямо сейчас, чтобы обойти эту проблему, я использую SQL-запрос, чтобы получить все нужные мне идентификаторы, затем перебираю этот список, получая каждый объект домена, делая то, что мне нужно, а затем выселяя его.

Кроме того, я не могу лениво загрузить B, потому что я нахожусь в среде сервлета, поэтому мой сеанс Hibernate закрывается, прежде чем я получаю доступ к свойствам в большинстве случаев.

@Entity
@Table(name="A")
public class A {

  private Long id

  @OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
  @JoinColumn(name = "a_id", referencedColumnName = "b_id", nullable = true)
  @NotFound(action = NotFoundAction.IGNORE)
  private B b

  ...getters and setters
}

@Entity
@Table(name="B")
public class B {
  private Long id;
  private byte[] blob;

  ...getters and setters
}

Спасибо

Ответы [ 2 ]

7 голосов
/ 02 ноября 2010

Есть ли какой-нибудь способ сказать Hibernate игнорировать это свойство для определенного вызова? Должен ли я просто сделать переходный B и иметь дело с обновлением / удалением вручную в этом случае?

Одним из вариантов будет использование отложенной выборки свойств (для этого требуется инструментарий байт-кода, см. Документацию). Таким образом, вы можете отобразить карту B следующим образом:

@Entity
@Table(name="B")
public class B {
  @Id
  private Long id;

  @Basic(fetch = FetchType.LAZY)
  @Lob
  private byte[] blob;

  // getters and setters
}

И, как задокументировано:

Вы можете вызвать обычную активную выборку свойств, используя fetch all properties в HQL.

Другим вариантом будет использование альтернативной версии A (A ') без B, для этого особого варианта использования.

Ссылки

1 голос
/ 02 ноября 2010

Поможет ли предложение select HQL?С соответствующим конструктором, добавленным к A, вы можете иметь HQL, возвращающий коллекцию A s со всеми ожидаемыми свойствами b.Если я правильно помню, Hibernate Session не отслеживает такие частичные объекты, поэтому обновления, внесенные в объект, не будут сбрасываться в БД.Но в вашем случае, поскольку вы все равно близки к Session, это может не иметь значения.

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