Наличие виртуальных строк в таблице в спящем режиме - PullRequest
2 голосов
/ 17 мая 2010

Я уверен, что это вопрос, на который большинство ответов будет «Зачем ты это делаешь?», Но я подумал, что задам вопрос.

У меня есть таблица (Пользователи), подавляющее большинство из которых просто имеют идентификатор (поскольку они лениво создаются пользователями для сеансов, которые никогда не предоставляли никакой информации), и не используют остальные столбцы в базе данных. Я решил просто удалить эти строки, чтобы сэкономить место в базе данных. Существует множество таблиц с внешними ключами к таблице, но только две или три могут ссылаться на этих фальшивых пользователей.

Для многих из этих таблиц я просто переключил отображение для отображения userid, а не объекта User, но некоторые объекты хотели бы иметь весь объект User, если он существует в таблице, и ноль в противном случае. .

CREATE TABLE users AS (userid bigint);
CREATE TABLE shopping_carts AS (cartid bigint, userid bigint);

Я не вижу, как отобразить это в Hibernate.

@Entity
class User {
  @Id
  long id;
}

@Entity
class ShoppingCart {
 @Id
 long id;
 @Column("userid")
 long userid; // Might not correspond to a user.
 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn("userid", insertable = false, updateable = false, nullable = true)
 User user;
}

Теперь, это не возвращает ноль, но выдает ObjectNotFoundException, если user_id указывает на несуществующего пользователя. Даже если вы добавите @Fetch(FetchMode.JOIN). Есть ли способ трактовать его как null, если он не существует?

Я рассмотрел несколько способов сделать это:

  1. Добавьте LoadEventListener, который возвращает специальные «нулевые объекты» при любой загрузке User, который ничего не нашел (и PreInsert/PreUpdateEventListener, который запрещает их сохранение).
  2. Добавление столбца дескриптора к ShoppingCart и наличие подкласса, для которого действительно отображается User, и класса, который не отображает его с использованием наследования одной таблицы.
  3. (edit) Отображение коллекции ManyToMany из User s, которая будет пустой коллекцией в случае, если ее не существует, и коллекции с одним идентификатором в другом случае - будет ли это работать без присоединиться к столу?

Есть комментарии к этим или другим идеям?

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Из справочника Hibernate вы можете сделать

@ManyToOne
@NotFound(action=NotFoundAction.IGNORE)

чтобы игнорировать отсутствующую запись.

1 голос
/ 17 мая 2010

Не уверен, как это выглядит в аннотациях, но в XML есть параметр "not-found":

<many-to-one name="user" class="com.example.User" column="userid" not-found="ignore" />
...