Обрабатывайте «0», «- 1» как ноль - PullRequest
4 голосов
/ 31 марта 2009

Я работаю с большой, старой базой данных, и теперь я пытаюсь получить к ней доступ через hibernate вместо SQL. Одной из самых больших проблем с этим является использование «0» и «-1» (что означает «NULL») в ForeignKeys без ограничений.

У меня была большая часть сгенерированного кода, но я добавляю соединения вручную. Как это

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(nullable = true, name = "fkActivityId")
public List<Activity> getActivities() {
    return activities;
}

Проблема в том, что как только у меня будет объект, имеющий fkActivityId = "-1" или "0", означающий NULL, возникнет исключение, сообщающее, что такой объект не может быть найден.

Есть ли способ заставить Hibernate вести себя так, как если бы он был NULL?

Ответы [ 4 ]

2 голосов
/ 17 апреля 2009

Я попробовал две вещи сейчас.

Я написал, что NullableIDType extends UserType будет возвращать значение NULL, если набор данных содержит «0» или «-1». Как предложил ДанВинтон (upvote!). Но есть проблема. Я должен установить для UserType идентификатор указанной модели .

@Id 
@GeneratedValue
@Column(name = "pkID", unique = true, nullable = false, type = NullableIDType)
public Integer getPkId() {
    return this.pkId;
}

Что заставляет все ссылки на эту модель использовать «0» вместо «ноль». Я забыл сказать, что большую часть времени ноль используется, когда это необходимо. Так что это сработало бы, если бы база данных последовательно использовала «0» вместо «ноль».

Тогда есть @NotFound (action = NotFoundAction.IGNORE) w

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="fkProjectBereichId",nullable = true)
@NotFound(action=NotFoundAction.IGNORE)
public Projectbereich getProjektbereich() {
    return projektbereich;
}

Сначала это казалось плохим, но работающим решением, пока я не сохранил что-то, у которого была нулевая ссылка. Он был сохранен как «нулевой» в базе данных, а затем вызвал сбой другого кода, как и ожидалось «0».

Таким образом, чтобы использовать спящие соединения, я должен везде использовать одно и то же значение для нуля. Нет пути вокруг.

Это не совсем удовлетворительный ответ на мой вопрос. Но это так.

1 голос
/ 31 марта 2009

Просмотрите вашу базу данных и обновите каждый fkActivityId до нуля, если его значение равно -1 или 0. Это то, для чего предназначен ноль. Hibernate делает свою работу правильно; это база данных, которая не настроена должным образом.

0 голосов
/ 31 марта 2009

Ответ Велбога на исправление данных будет предпочтительным методом.

Если вы действительно не можете исправить данные, вы можете написать пользовательский тип значения , чтобы сопоставить грязное логическое поле DB с логическим значением Java и обратно.

0 голосов
/ 31 марта 2009

Извините, я знаю, что это не отвечает на вопрос, но действительно намного лучше, если вы можете.

update ExampleTable 
set fkActivityId = null 
where fkActivityId = 0 or fkActivityId = -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...