hibernate: поиск списка дочерних идентификаторов для родителя

Технология: Спящий режим 3.0

Предположим, у меня есть компания класса Entity.

    @Entity
    @Table(name="tbl_companies")  
    public class Company
    {
            @Id
            @Column(name="id") 
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            int id;

            @Column(name="name")
            String companyName;

            @OneToMany(mappedBy = "company")
            List<Employees> empList;

            @OneToMany(mappedBy = "company")
            List<Projects>  projectList;

            @OneToMany(mappedBy = "company")
            List<Department> deptList;

            @OneToMany(mappedBy = "company")
            List<Branch>     branchList;       
    }

В Entity Company, которая сопоставляется с базой данных с помощью аннотации hibernate, содержится список других связанных с ней объектов. Поскольку объекты этих сущностей, таких как Branch, Project, Employee, сами по себе являются тяжелыми объектами, это сделает объект Company очень тяжелым и будет содержать почти все данные db. Один из способов избежать этого — использовать ленивую загрузку. Еще один подход может заключаться в использовании List branchIdList, List projectIdList, который представляет собой список идентификаторов для объектов. Мой вопрос, какой подход является стандартной практикой и лучше использовать в такой ситуации. Лучше использовать включает в себя такие факторы, как производительность с точки зрения памяти, в основном, гибкость для программиста (первый является гибким для программиста, а второй использует меньше памяти). Другой вопрос: если я использую второй подход, что изменится в аннотации. Я сомневаюсь, что hibernate поддерживает список идентификаторов или поддерживает только полноценные объекты.

Спасибо


person Maddy.Shik    schedule 15.12.2010    source источник


Ответы (2)


Еще один подход может заключаться в использовании List branchIdList, List projectIdList, который представляет собой список идентификаторов для объектов.

Пожалуйста, очень хорошо подумайте, прежде чем делать это. Весь смысл использования ORM заключается в том, что строки в БД, которые связаны друг с другом через внешние ключи, могут быть представлены как объекты, связанные с помощью обычных ссылок и коллекций Java. Используя описанную вами схему, вы потеряете большинство преимуществ использования Hibernate.

Рекомендуемый подход заключается в использовании отложенной загрузки.

Лучше использовать включает в себя такие факторы, как производительность с точки зрения памяти, в основном, гибкость для программиста (первый является гибким для программиста, а второй использует меньше памяти).

ИМХО, память, которую вы получаете, если таковая имеется, не стоит той боли программиста, которую она причиняет.

person Binil Thomas    schedule 15.12.2010
comment
Весь смысл использования ORM заключается в том, что строки в БД, которые связаны друг с другом через внешние ключи, могут быть представлены как объекты, связанные с помощью обычных ссылок и коллекций Java. Это то, о чем я думал, поэтому я не хотел использовать второй подход. Но все же, если кто-то хочет реализовать второй подход, что нужно изменить в аннотации? - person Maddy.Shik; 15.12.2010
comment
stackoverflow.com/questions/4415260/ Пожалуйста, ответьте на этот вопрос также по возможности. - person Maddy.Shik; 15.12.2010

Я думаю, вы должны сначала увидеть свои варианты использования для получения объекта Company. Означает, например, что существует слишком много сценариев, в которых сотрудники извлекаются с объектом компании. Существует меньше сценариев, когда проекты извлекаются с объектом компании. Итак, следуя этим, вы можете удалить список проектов из объекта «Компания» и сделать его «многие к одному» из объекта «Проект» (получить его вручную). Итак, проанализируйте все свои сценарии и сделайте некоторые отношения многие-к-одному. Сделайте другой список ленивым.

person Nikunj    schedule 15.12.2010
comment
Спасибо за ответ. Например, выше класс компании. Определенно я буду избегать списка ненужных объектов. Тем не менее, если кто-то хочет пойти со вторым подходом, каким должен быть код аннотации? - person Maddy.Shik; 15.12.2010