Hibernate: колонка не мапится на геттер

104
19 октября 2019, 11:40

Написал самый обычный класс-сущность и столкнулся с проблемой.

Вот класс-сущность:

@Entity(name = "user_block_history")
@EqualsAndHashCode(callSuper = true)
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserBlockHistory extends AbstractPersistable<Integer> {
    private Integer userId;
    private Boolean blocked;
    private String cause;
    private Date eventDateTime;
    private Integer blockReasonId;
    private Boolean finOperationExists;
    @Column(name = "user_id")
    public Integer getUserId() {
        return userId;
    }
    @Column(name = "block")
    public Boolean getBlocked() {
        return blocked;
    }
    @Column(name = "cause")
    public String getCause() {
        return cause;
    }
    @Column(name = "event_date")
    public Date getEventDateTime() {
        return eventDateTime;
    }
    @Column(name = "block_reason_id")
    public Integer getBlockReasonId() {
        return blockReasonId;
    }
    @Column(name = "fin_operations_exists")
    public Boolean getFinOperationExists() {
        return finOperationExists;
    }
}

Существует, как вы знаете, два подхода к мапингу полей. Вешать аннотации на поля и вешать их на геттеры. Второй подход считается более правильным, поскольку тогда Hibernate не вынужден ломать приватность полей. Этот подход я пользую уже полтора года. Но тут случилось следующее:

Caused by: org.hibernate.HibernateException: Missing column: blockReasonId in gamebet_2018_12_05.user_block_history

Когда же я вешаю аннотацию на само поле, hibernate его валидирует и спотыкается уже на следующем. То есть, получается, что hibernate не воспринимает аннотацию на геттере, но воспринимает её на поле.

Вариант перевесить аннотации на поля и успокоиться - согласитесь, для слабаков :)

Скрипт создания таблицы, чтобы не было лишних вопросов по именованию полей:

create table user_block_history
(
  id                    int auto_increment
    primary key,
  user_id               int          not null
  block                 tinyint(1)   not null
  cause                 varchar(255) null
  event_date            datetime              default current_timestamp() not null
  block_reason_id       int          not null default 13 
  fin_operations_exists tinyint(1)   null 
)

Интересно, что такой же подход один в один применён в другой сущности в том же пакете, и всё работает.

READ ALSO
ошибка при работе с библеотекой Kotlogram java.lang.RuntimeException: AuthKey must be 256 Bytes found 0 bytes

ошибка при работе с библеотекой Kotlogram java.lang.RuntimeException: AuthKey must be 256 Bytes found 0 bytes

Я разрабатываю приложение на Java с использованием библиотеки kotlogramПример кода:

140
Цикл foreach против Iterable.foreach в Java 8: что лучше?

Цикл foreach против Iterable.foreach в Java 8: что лучше?

Что из следующего является лучше практикой в Java 8?

107
Как проверить время отрисовки ui layout xml

Как проверить время отрисовки ui layout xml

gui приложения при открытии долго грузиться как можно померить время загрузки ? за сколько от отрисовывает layoutxml

71
не могу получить список информации о всех подписчиках бота в вайбере (API)

не могу получить список информации о всех подписчиках бота в вайбере (API)

Всем привет помогите пожалуйста найти ссылку или запрос который поможет мне вытащить список подпищиков моего вайбер ботаВ документации...

95