Я уверен, что это вопрос, на который большинство ответов будет «Зачем ты это делаешь?», Но я подумал, что задам вопрос.
У меня есть таблица (Пользователи), подавляющее большинство из которых просто имеют идентификатор (поскольку они лениво создаются пользователями для сеансов, которые никогда не предоставляли никакой информации), и не используют остальные столбцы в базе данных. Я решил просто удалить эти строки, чтобы сэкономить место в базе данных. Существует множество таблиц с внешними ключами к таблице, но только две или три могут ссылаться на этих фальшивых пользователей.
Для многих из этих таблиц я просто переключил отображение для отображения 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
, если он не существует?
Я рассмотрел несколько способов сделать это:
- Добавьте
LoadEventListener
, который возвращает специальные «нулевые объекты» при любой загрузке User
, который ничего не нашел (и PreInsert/PreUpdateEventListener
, который запрещает их сохранение).
- Добавление столбца дескриптора к
ShoppingCart
и наличие подкласса, для которого действительно отображается User
, и класса, который не отображает его с использованием наследования одной таблицы.
- (edit) Отображение коллекции
ManyToMany
из User
s, которая будет пустой коллекцией в случае, если ее не существует, и коллекции с одним идентификатором в другом случае - будет ли это работать без присоединиться к столу?
Есть комментарии к этим или другим идеям?