JPA - нормально ли по умолчанию идентификатор равен 0?

1

У меня есть простой объект с автоинкрементным идентификатором.

@Entity
public class MyEntity implements Serializable
{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long    id;

У этого есть метод hashCode, который был создан для меня.

@Override
public int hashCode()
{
    return (int) (id ^ (id >>> 32));
}

Проблема в том, что я пытаюсь добавить аудит к этому классу, но он вызывает hashCode до того, как сущность сохраняется, и поэтому id равен null.

Мое решение (которое работает) состоит в том, чтобы инициализировать id до 0, пока оно не сможет получить правильное значение настойчиво.

private Long    id = 0L;

Вопрос в том, приемлемо это или нет? Мой страх - это изменение hashCode, но это не лучше, чем NPE?

Теги:
jpa
hashcode

2 ответа

3
Лучший ответ

Вы должны скорее исправить свой hashCode для обработки нулей. Если вы установите id на 0, это не будет изменяться при сохранении.

  • 0
    Вы правы, чтобы сделать хэш-код нулевым. На самом деле я использую jHipster, и я только что нашел эту ошибку, которая описывает мою точную проблему. github.com/jhipster/generator-jhipster/pull/1177 JPA заполнял идентификатор, хотя я и установил его на 0. Если это был примитивный длинный, он должен был бы быть 0. Возможно, это поведение не определено в спецификации JPA но это работало. Как вы говорите, исправление hashCode - лучшее решение. Благодарю.
  • 0
    Это может зависеть от реализации / (стратегии генерации) / (автоинкремента БД). Некоторое время назад, если я сам установил id, использовалось заданное значение, но я не пробовал его с момента обновления JPA.
2

Имейте в виду, что JPA работает со значениями по умолчанию Java.

Если ваш идентификатор является Wrapper, новый объект должен иметь идентификатор null.

Если ваш идентификатор - int/long/etc, то значение по умолчанию должно быть 0, 0L и т.д.

Если вы установите свой ID Long = 0, JPA поймет, что в базе данных есть объект Entity с ID = 0 и, вероятно, говорит, что ваш объект отсоединен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню