Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аннотации в JPA? 
:(
    Опции темы
oson
Дата 2.11.2012, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



В примерах к книге PRO JPA 2 используются аннотации к полям 

Код

  @OneToMany(mappedBy = "department")
    private Collection<Employee> employees;

    public Department()
    {
        employees = new ArrayList<Employee>();
    }

 public void addEmployee(Employee employee)
    {
        if (!getEmployees().contains(employee))
        {
            getEmployees().add(employee);
            if (employee.getDepartment() != null)
            {
                employee.getDepartment().getEmployees().remove(employee);
            }
            employee.setDepartment(this);
        }
    }

    public Collection<Employee> getEmployees()
    {
        return employees;
    }


В примерах к Pro Spring 3 используются аннотации к getter
Код

 private Set<ContactTelDetail> contactTelDetails = new HashSet<ContactTelDetail>();
 @OneToMany(mappedBy = "contact", cascade = CascadeType.ALL, orphanRemoval = true)
    public Set<ContactTelDetail> getContactTelDetails()
    {
        return this.contactTelDetails;
    }


Что лучше использовать - аннотации к полям или к геттерам?
И нужно ли инициализировать Set или List - сам он не проинициализируется благодаря мэппингу?

PM MAIL   Вверх
Pawl
Дата 22.11.2012, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(oson @  2.11.2012,  00:17 Найти цитируемый пост)
Что лучше использовать - аннотации к полям или к геттерам?

точно не скажу, сам применял аннотации к полям - все получалось

Цитата(oson @  2.11.2012,  00:17 Найти цитируемый пост)
И нужно ли инициализировать Set или List - сам он не проинициализируется благодаря мэппингу?

сам он проинициализируется, только если в аннотации @OneToMany указать fetch = FetchType.EAGER


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
zhz
Дата 10.12.2012, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 31.10.2006
Где: Petropavlovsk-Kam chatsky

Репутация: нет
Всего: 2



Согласно спецификации существуют два уровня доступа: доступ по полям(field access)  и доступ по методам(property access).   
пример field access :
Код

@Entity
public class MyEntity {
@Id @GeneratedValue
private Long id;

public Long getId() {....}
}

пример property access:
Код

@Entity
public class MyEntity {
private Long id;

@Id @GeneratedValue
public Long getId() {....}
}

приведенные сущности по сути полностью идентичны. Выбор уровня доступа зависит от предпочтения разработчика. многие используют proprty access считая код более читабельным.  
В спецификации сказано, что совместное использование property access и field access без явного указания уровня доступа недопустимо и может приводит к ошибкам.
При использовании доступа по полям, PersistenceProvider мапит все аттрибуты не помеченные аннотацией @Transient. Тоже самое, только наооборот. при сипользовании доступа по методам, - мапится по геттерам все, что не помечено @Transient.       
Явно уровень доступа можно указать используя аннотацию @javax.persistence.Access:
Код

@Entity
@Access(AccessType.FIELD) 
public class MyEntity {
.........
}

В данном случае мапится будет по полям, и аннотированные  методы будут проигнорированы при мапинге.
PM MAIL ICQ   Вверх
Старовъръ
Дата 11.12.2012, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



Проблемы field access:
  • Доступ осуществляется к private членам класса, то бишь в некотором окружении это не допустимо, где конфигурируется строгий SecurityManager.
  • В перемешку с BeanValidation (а его аннотации в некоторых случаях просто нельзя устанавливать на поля), может получиться каша
  • Нет возможности переопределить какое-то поведение, возвращаемое значение. Такая необходимость правда редко возникает.
  • При вызове любого метода, прокси будет инициализироваться. В случае с property-access при вызове getId(), просто возвращается ID. В случае с field-access прокси инициализируется. Это может ударить по производительности в некоторых случаях.
Проблемы property access:
  • Намного сложней помещать какую-то бизнес логику в сущности. Например, свою валидацию, которая зависит от других полей. Когда Hibernate будет устанавливать эти свойства, он это будет делать в алфавитном порядке, соответственно зависимое свойство еще может быть не установлено.
  • Нет возможности возвращать к примеру Collections.unmodifiableCollection(), потому как при работе с Hibernate это приведет к проблемам с производительностью, а в некоторых случаях и просто к исключениям.
  • В двусторонней связи нельзя просто взять и в setXxx(Xxx xxx) устанавливать обратную сторону: xxx.setYyy(this). Поэтому приходится создавать package-private методы исключительно для Хиба, а обычные get-set используются в остальной части приложения.
Я лично предпочитая property-access за его всемогучесть, даже если придется что-то обойти, костыль всегда можно найти. В случае же с field access бывают ситуации, которые просто невозможно обойти (SecurityManager, BeanValidation, getId()).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.