Hibernate обрабатывает значение long 0 вместо NULL в отношениях ManyToOne - PullRequest
6 голосов
/ 07 ноября 2011

Я использую Hibernate для доступа к устаревшей БД. Для некоторых таблиц целостность родительско-дочерних ссылок не применяется, и значение long 0 используется вместо NULL для некоторых «родительских» столбцов в дочерних таблицах для обозначения «нет родителя».

Я все еще хочу использовать эти отношения в полях @ManyToOne и @OneToMany, но получаю ошибку EntityNotFound, поскольку значение 0 не соответствует ни одной записи в основной таблице.

Какие у меня варианты?

Ответы [ 3 ]

8 голосов
/ 07 ноября 2011

Используйте аннотацию NotFound:

@NotFound(action = NotFoundAction.IGNORE)

См. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-manytoone

0 голосов
/ 06 мая 2015

Вместо @JoinColumn можно использовать @JoinFormula. Как это

@JoinFormula(value="CASE the0isNullColumn WHEN 0 THEN NULL ELSE the0isNullColumn END")

Выражение означает, что мы проверяем столбец и, если он равен 0, возвращаем NULL. Тогда hibernate не ищет связанный объект.

0 голосов
/ 07 ноября 2011

Вы можете сопоставить его с java.lang.Long, значение по умолчанию которого равно нулю.Или вы можете использовать @PostLoad и обнулить его, если 0.Вы также можете использовать @Formula и игнорировать 0.

. @Formula, как написано в их документации , может использоваться для join conditions.

.Я не знаю, какая у вас модель данных, предоставив правильный пример, сложно.Попробуйте:

id_fk is not null or id_fk <> 0

block.

Если он не соответствует вашим потребностям, вы можете написать свой собственный Загрузчик запросов

Если вы используетекакое-то ведение журнала разрешает свойство show_sql.И добавьте в свой конфиг org.hibernate.sql DEBUG.

...