У меня есть простой объект с автоинкрементным идентификатором.
@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?
Вы должны скорее исправить свой hashCode для обработки нулей. Если вы установите id на 0, это не будет изменяться при сохранении.
Имейте в виду, что JPA работает со значениями по умолчанию Java.
Если ваш идентификатор является Wrapper, новый объект должен иметь идентификатор null.
Если ваш идентификатор - int/long/etc, то значение по умолчанию должно быть 0, 0L и т.д.
Если вы установите свой ID Long = 0, JPA поймет, что в базе данных есть объект Entity с ID = 0 и, вероятно, говорит, что ваш объект отсоединен.