2013-07-23 4 views
1

Я использую JPA 2.Использование каскадного = cascadeType и выборки = FetchType

Я хотел бы знать следующее.

  • Каков наилучший подход для ограничения вставки, обновления или удаления, когда родительский ключ не существует в родительской таблице.

    У меня есть следующий сценарий Entity

    @Entity 
        public class Employee { 
        @OneToMany(mappedBy = "requester") 
        private Set<Project> requestedProjects; 
    
        @OneToMany(mappedBy = "approver") 
        private Set<Project> approvedProjects; 
        } 
    
        @Entity 
        public class Project 
        @ManyToOne 
        @JoinColumn(name = "EMPLOYEE_NUMBER", referencedColumnName = "EMPLOYEE_NUMBER") 
        private Employee requester; 
    
        @ManyToOne 
        @JoinColumn(name = "APPROVER", referencedColumnName = "EMPLOYEE_NUMBER") 
        private Employee approver; 
        } 
    

Что такое мое ограниченное понимание этого вопроса является использование cascade=cascadeType.ALL делает вставки и удаления, если родительский ключ не существует.

И в чем разница между MERGE, PERSIST и ALL?

  • Кроме того, когда это целесообразно использовать fetch = FetchType

Любая помощь является весьма заметным

ответ

2

Это отдельные вопросы. 1) Настройки каскада выполняют то, что предлагает название: когда вы вызываете entityManager, сохраняете, объединяете или удаляете, он выполняет операцию над переданной сущностью. Затем этот вызов становится каскадным для ссылочных объектов в зависимости от настроек сопоставления, как если бы вы явно вызывали это метод на ссылочном объекте. Таким образом, Project-> requester, если вы вызываете persistent в Project, он будет вызывать persistent как для проекта, так и для запрашивающего сотрудника, если заданы каскад persist или все типы. Поэтому, если сотрудник существует, но отключен, он может вызвать исключение либо сразу, либо на флеш/фиксацию в зависимости от вашего провайдера, как если бы вы напрямую вызвали em.persist (employee). Слияние и удаление работают одинаково, следуя собственным ограничениям и поведению, описанным в спецификации JPA.

CascadeType.All - это просто удобный способ перечисления всех типов каскадов: УДАЛИТЬ, ПЕРСИСТ и MERGE, не набирая их.
Вы должны использовать их, когда они имеют смысл, а не просто отмечать все отношения как CascadeType.ALL. Существует множество руководств, которые могут помочь

2) Тип выборки определяет, когда происходит выборка. Обычно рекомендуется использовать Lazy, поэтому он является стандартным для сопоставлений коллекции в спецификации JPA, так как приведение объектов без необходимости может тратить ресурсы. Но все зависит от шаблонов использования вашего приложения и того, как вы оптимизировали поставщика, базу данных и сопоставления. Используя значения по умолчанию, чтение в проекте не приведет к чтению всех ссылоченных сотрудников, пока сбор не будет запущен. Но чтение в Employee приведет к тому, что его проект будет считаться из базы данных. Следует обратить внимание на то, что, читая в одном экземпляре объекта, вы не ошибочно читаете во всей базе данных, что является обычным явлением, если у вас есть интересные коллекции.

+0

Крис У меня есть сомнения относительно типа выборки и ленивой выборки. Если у меня есть какая-то ленивая загрузка, которая уже является частью моего приложения на передней панели, то есть я не загружаю все записи из базы данных, это основано на разбиении на страницы записей, когда записи отображаются в приложении. Я сомневаюсь, что мне нужно, чтобы все еще позволять получать ленивый? – user75ponic

+0

Я не уверен, что понял вопрос. Если вы включили его, почему вам все еще нужно включить ленивый выбор? тип lazy fetch устанавливается на отображение, предотвращающее автоматическое чтение ссылочных объектов, когда считывается родительский объект.Если вы читаете в ребенке каким-то другим способом, чтение в родительском элементе по-прежнему будет заставлять JPA пытаться разрешить родительские -> дочерние отношения, если они не будут помечены как ленивые или оставленные без изменений. – Chris

+0

Спасибо Крису за подробное объяснение. – user75ponic

Смежные вопросы