Подтвердить что ты не робот

Какова цель AccessType.FIELD, AccessType.PROPERTY и @Access

Я просто хочу знать, в чем разница между всеми этими аннотациями. Почему мы используем эти... означает, что они не имеют никакого эффекта, особенно уровень поля и уровень собственности.

И какова цель использования смешанной аннотации уровня, например:

@Entity
@Access(AccessType.FIELD)
class Employee {
    // why their is a field level access 
    private int id;

    // whats the purpose of transient here
    @Transient                               
    private String phnnumber;

    // why its a property level access
    @Access(AccessType.property)             
    public String getPhnnumber() {
        return "1234556";
    }

}

что именно говорит этот класс?

4b9b3361

Ответ 1

По умолчанию тип доступа определяется местом, где вы помещаете аннотацию идентификатора (@Id). Если вы положите его на поле - это будет AccessType.FIELD, если вы поместите его на геттер - это будет AccessType.PROPERTY.

Иногда вам может потребоваться аннотировать не поля, а свойства (например, потому что вы хотите иметь какую-то произвольную логику в getter или потому, что вы так предпочитаете). В такой ситуации вы должны определить геттер и аннотировать его как AccessType.PROPERTY.

Насколько я помню, если вы укажете либо AccessType.FIELD, либо AccessType.PROPERTY для любого из полей/методов сущности, вы должны указать поведение по умолчанию для всего класса. И поэтому вам нужно иметь AccessType.FIELD на уровне класса (несмотря на то, что AccessType.FIELD - значение по умолчанию.)

Теперь, если у вас не было бы @Transient в поле phnnumber, JPA предоставит вам таблицу с тремя столбцами:

  • id,
  • phnnumber,
  • getphnnumber.

Это потому, что он использовал бы AccessType.FIELD для всех полей сущности (id и phnnumber) и в то же время использовал бы AccessType.PROPERTY для вашего получателя (getPhnnumber()). < ш > Вы закончите с номером телефона, дважды отображаемым в базе данных.

Следовательно, требуется аннотация @Transient - это означает, что объект не сохранит значение поля в базовом хранилище, но значение, возвращаемое вашим getter.