Неверное предупреждение о гибернации?«@Access (AccessType.PROPERTY) для поля не имеет никакого эффекта» - PullRequest
7 голосов
/ 09 марта 2011

У меня есть следующий класс сущности Пользователь:

public class User implements Serializable {

    @Column(length = 10, name = "user_type")
    @Access(AccessType.PROPERTY)
    private String userTypeS;

    @Transient
    private UserType userType;
    ...
    public void setUserType(UserType userType) {
        this.userType = userType;
        this.userTypeS = this.userType.getType();
    }

    protected void setUserTypeS(String userTypeS) {
        this.userTypeS = userTypeS;
        userType = UserType.toUserType(userTypeS);
    }

UserType - это перечисление. Эта проблема заключалась в том, что я не мог просто использовать аннотацию @Enumerated для сопоставления UserType, поскольку представление перечислений в коде отличается от представления в, например ::

public enum UserType {
CUSTOMER_NON_PRO("custnop") ...

Когда я работаю с сущностью, я хотел установить enum как userType, а не его строковое представление. Для этого я создал открытый сеттер, который устанавливает enum (userType) и переводит его в его строковое представление (которое отображается с помощью hibernate). Точно так же существует защищенный setUserTypeS, который должен вызываться hibernate и отображать String userType в enum UserType.

Для этого, конечно, hibernate должен использовать сеттеры для заполнения сущности. В нашем проекте предпочтительно устанавливать аннотации на самих свойствах, т.е. добытчики / сеттеры. Следовательно, hibernate будет устанавливать значения свойств напрямую с помощью самоанализа (и тем самым обходить установщики). Для userTypeS я указал, что типом доступа является PROPERTY (т.е. FIELD), и из-за этого hibernate будет вызывать setUSerTypeS.

Все это работает гладко. Проблема заключается в том, что в наших журналах мы видим следующее предупреждение:

org.hibernate.cfg.AnnotationBinder - Размещение @Access (AccessType.PROPERTY) в поле не имеет никакого эффекта.

Это предупреждение не является правильным. Если бы я удалил @Access(AccessType.PROPERTY) из поля userTypeS, то hibernate не вызвал бы установщик, и, следовательно, enum userType не был бы установлен. Таким образом, размещение @Access(AccessType.PROPERTY) оказывает влияние.

Является ли это предупреждающее сообщение недействительным или устаревшим, или я что-то неправильно понимаю?

спасибо,
Стейн

Ответы [ 2 ]

7 голосов
/ 09 марта 2011

@ Access (AccessType.PROPERTY) предназначен для размещения на геттере, например:

@Access(AccessType.PROPERTY)
@Column(length = 10, name = "user_type")
public String getUserType() {
    return this.userType.getType();
}

public void setUserType(UserType userType) {
    this.userType = userType;
}

protected void setUserType(String userType) {
    userType = UserType.toUserType(userTypeS);
}

private String userTypeS; не требуется вообще.

4 голосов
/ 09 марта 2011

У меня нет решения для вас, но в соответствии со спецификацией JPA 2.0 (стр. 26, сноска 8):

Не разрешается указывать поле как Access (НЕДВИЖИМОСТЬ) или свойство как Access (ПОЛЕ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...