У меня есть следующий класс сущности Пользователь:
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)
оказывает влияние.
Является ли это предупреждающее сообщение недействительным или устаревшим, или я что-то неправильно понимаю?
спасибо,
Стейн