Hibernate: выбирать из БД не все поля

379
30 мая 2017, 00:12

Возможно ли в Hibernate такое: При получении Entity из БД выбирать не все поля а только некоторые, чтобы снизить нагрузку на базу? Например, при логине пользователя нам не нужно "тянуть" из БД все его атрибуты, нужны поля только login и password. При редактировании профиля пользователя, конечно же, выбираем все поля таблицы users.

Возникла идея - создать в коде две сущности - одна UserSmall(id,login,password) а вторая User с полным набором полей. Но догадается ли Hibernate что это ссылки на одну и ту же таблицу и будет ли синхронизировать сущности?

Answer 1

Да, можно замапить 2 сущности на одну таблицу, и Hibernate догадается, что эти 2 (или более) сущности указывают на ту же таблицу. Для этого используется аннотация @Table(name = "table_name").
Нет, они не будут синхронизированы в том смысле, что, если одновременно активны две сущности - User и UserSmall - изменения из User не попадут в UserSmall магическим образом (нужно будет селектнуть UserSmall после сохранения User, чтобы получить обновленные данные).

Если попытаться сохранить запись с неполным набором полей в базу, то, генерируя запрос, в остальные, незамапленные поля, Hibernate подставит null.
Поэтому одну из них, UserSmall, я рекомендовал бы пометить аннотацией @Immutable, чтобы предотвратить случайное сохранение в базу. Так как скорей всего она будет использоваться вами только для чтения.
Ещё может пригодиться аннотация @DynamicUpdate. Она позволяет селектать и сохранять в базу неполную запись (в примере ниже см. UserUpdatable, в к-м сохранятся изменения только в полях firstName, lastName).

@Entity
@Table(name = "user")
public class User {
    // все поля
}
@Entity
@Table(name = "user")
@Immutable
public class UserSmall {
    // id, login, password
}
@Entity
@Table(name = "user")
@DynamicUpdate
public class UserUpdatable {
    // id, firstName, lastName
}
  1. Документация @DynamicUpdate
  2. Документация @Immutable
READ ALSO
Новый поток в сервисе

Новый поток в сервисе

Есть сервис такого типа, который запускается каждый раз при открытии приложения:

262
Android визуализация голосового сообщения

Android визуализация голосового сообщения

У голосового сообщения есть массив значений для визуализации, нужно сделать эту визуализациюКак это лучше сделать? Пример массива:

226
Открыть файл Html из приложения

Открыть файл Html из приложения

Можно ли как-нибудь при нажатии на кнопку, чтобы открывался в браузере файл htmlЯ закинул его в папку assets а что дальше делать не знаю

265